代码之家  ›  专栏  ›  技术社区  ›  夏期劇場

Slim框架:如何捕获多条完全可选的路由?

  •  0
  • 夏期劇場  · 技术社区  · 6 年前

    我已经拥有的

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

    $app->get('/{id}', function(...){
        if ( $args['id'] ) {
            /**
             * Show Item Details
             */
        } else {
            /**
             * Redirects to Home
             */
        }
    });
    

    这很有效。这意味着:

    www.example。com/DRX1487

    我想要实现的目标

    现在我想要的是:

    www.example。com/DRX1487/重新订购

    www.example。com/DRX1487/取消

    我试过:

    $app->get('/{id}/{action}', function(...){...});
    
    $app->get('/:id/:action', function(...){...});
    

    两者都不起作用。

    请问我如何做到这一点?我找到的所有示例(对于可选路由)都是基于静态基本路由优先的。但我的基本路线已经是可选路线了。

    请告知。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Zamrony P. Juhara    6 年前

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

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