主要的是,我的基本路线已经是一条可选路线。就像:
$app->get('/{id}', function(...){
if ( $args['id'] ) {
/**
* Show Item Details
*/
} else {
/**
* Redirects to Home
*/
}
});
这完全奏效了。这转化为:
www.example.com/DRX1487
现在我想要的是:
www.example.com/DRX1487/reorder
www.example.com/DRX1487/cancel
我试过了:
$app->get('/{id}/{action}', function(...){...});
$app->get('/:id/:action', function(...){...});
两者都不起作用。
我如何实现这一目标?我发现的所有示例(对于可选路由)都首先基于静态基本路由。但我的基本路线已经是一条可选路线。
请劝告。
答案 0 :(得分:2)
使用单独的路径,处理操作的每个代码都可以简单且精简。例如。
$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
*/
}
});