Slim Framework:如何捕获多个完全可选的路由?

Slim Framework: How to catch multiple fully OPTIONAL routes?

我已经拥有的

主要是,我的基本路线已经是可选路线。也就是:

$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(...){...});

两者都不行。

请问我该如何实现?我发现的所有示例(用于可选路由)都是首先基于静态基本路由。但是我的基本路线已经是可选路线了。

请多指教

使用单独的路由,每个处理操作的代码都可以简单且精简。例如。

 $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
          */
     }
});