我正在使用控制器(在本例中命名爲Action),並且仍然在一個文件中具有所有路由。
此外,我使用分組無論我可以因爲它給一個更好的結構(在我看來)。 我嘗試使Action-classes儘可能小,我不需要查看路由文件來獲取我想要更改的類。
下面的例子:
路線 - 文件:
$app->get('/user/{name}', [ShowUserAction::class, 'showUser'])->setName('user');
$app->get('/login', [LoginUserAction::class, 'showLogin'])->setName('login');
$app->group('/api', function() {
$this->get('/images', [ImagesApi::class, 'getImages'])->setName('api.images');
$this->get('/tags', [ImagesApi::class, 'getTags'])->setName('api.tags');
$this->get('/notifications', [UserNotificationsApiAction::class, 'getNotifications'])->setName('api.notifications');
$this->get('/bubbleCount', [BubbleCountApiAction::class, 'getBubbleCount'])->setName('api.bubbleCount');
});
$app->group('/review', function() use ($currentUser) {
$this->get('', [ReviewAction::class, 'showReviewOverview'])->setName('review.overview')->setName('review')
$this->get('/{type}', [ReviewAction::class, 'showReviewWithType'])->setName('review.type')
$this->get('/{type}/{id}', [ReviewAction::class, 'showReview'])->setName('review.type.id')
});
動作類:
class LoginUserAction
{
public function __construct() { } // with parameters
public function showLogin(Request $request, Response $response)
{
if ($this->currentUser->isLoggedIn()) {
return $response->withRedirect($this->router->pathFor('index'));
}
return $this->view->render($response, 'user/login.twig');
}
public function doLogin(Request $request, Response $response)
{
// check user name password and then login
}
}
要構建的API快你可能想切換到Laravel和使用[資源管理器](https://laravel.com/docs/5.4/controllers#resource-controllers)。相同的路由語法! –
我會閱讀關於laravel。但我試圖找到一些使用苗條的PHP解決方案。像一些控制器包一樣,因爲我想保持使用slim而不是改變框架。 –