超薄框架:如何捕获多个完全可选的路线?

时间:2018-04-16 03:46:00

标签: php routes arguments slim optional

我已经拥有的

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

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

两者都不起作用。

我如何实现这一目标?我发现的所有示例(对于可选路由)都首先基于静态基本路由。但我的基本路线已经是一条可选路线。

请劝告。

1 个答案:

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