通过单独的路由,处理操作的每个代码都可以简单且精简。例如
$app->get('/', HomeController::class);
$app->get('/{id}', ItemDetailController::class);
$app->get('/{id}/reorder', ItemDetailReorderController::class);
$app->get('/{id}/cancel', ItemDetailCancelController::class);
主页控制器
class HomeController
{
public function __invoke($request, $response, $args)
{
//do something
return $response;
}
}
与项目相关的基本控制器
abstract class BaseItemDetailController
{
protected function isValidId($id)
{
//do validation of id here
}
abstract public function __invoke($request, $response, $args);
}
显示项目详细信息的控制器数据
class ItemDetailController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to display item detail
}
return $response;
}
}
再订购项目的控制器
class ItemDetailReorderController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to reorder item
}
return $response;
}
}
处理取消项目的控制器
class ItemDetailCancelController extends BaseItemDetailController
{
public function __invoke($request, $response, $args)
{
$id = $args['id'];
if ($this->isValidId($id)) {
//do something to cancel item ordered
}
return $response;
}
}
可选参数使用括号定义。使用最初的方法,事情很容易变得复杂,如果可以,请避免下面的代码。
$app->get('/[{id}[/{action}]]', function(...) {
if (isset($args['id'])) {
if (isValid($args['id'])) {
if (isset($args['action'])) {
if ($args['action'] === 'reorder') {
//do item reorder
return $response;
}
if ($args['action'] === 'cancel') {
//do item cancel
return $response;
}
//do something (display item detail?)
return $response;
} else {
//show item detail
}
}
} else {
/**
* Redirects to Home
*/
}
});