【问题标题】:How to provide choices for Laravel route parameter如何为 Laravel 路由参数提供选择
【发布时间】:2016-08-25 11:31:38
【问题描述】:

我想要完成的是,我有一个接受名为type 的参数的路由,它现在接受任何值。但我想提供选择来接受值,如果匹配路由有效,否则会抛出 Not found 错误。

选择是:

  1. 转推
  2. 最喜欢的
  3. 推文

代码:

Route::get('/activity/{type}/status','ActivitiesController@status');

ActivityController.php

class ActivitiesController extends Controller
{
    public function status($type, Request $request)
    {
        return $request->all();
    }
}

【问题讨论】:

    标签: php laravel routes


    【解决方案1】:

    您可以使用正则表达式约束,例如:

    Route::get('/activity/{type}/status','ActivitiesController@status')
        ->where('type', '(retweet|favorite|tweet)');
    

    【讨论】:

      【解决方案2】:

      这将检查$type。不合适的话会redirect to 404 error page:

      public function status($type, Request $request)
      {
          if ($type != 'retweet' && $type != 'favorite' && $type != 'tweet') {
              abort(404);
          }
      
          return $request->all();
      }
      

      替代方案:

      Route::get('/activity/{type}/status', function()
      {
          if ($type == 'retweet' || $type == 'favorite' || $type == 'tweet') {
              $app = app();
              $controller = $app->make('ActivitiesController');
              $controller->callAction($app, $app['router'], 'status', $parameters = array());
          }
      });
      

      备选方案 2:

      仅当您只有 3 种类型并且以后不会添加任何类型时。这是一个愚蠢的,但更易读且更易于维护:

      Route::get('/activity/retweet/status','ActivitiesController@status');
      Route::get('/activity/favorite/status','ActivitiesController@status');
      Route::get('/activity/tweet/status','ActivitiesController@status');
      

      另外,您可以use middleware。这是你的选择。 )

      【讨论】:

      • 我知道这种方式,但我想过滤路由站点上的请求,因为我还有其他函数可以向相同的路由语法发出 post 请求,我从它们那里获取 $type 参数,如果我遵循这种模式,我将不得不在每个函数中进行检查。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-05
      • 1970-01-01
      • 2022-01-24
      • 2014-10-13
      • 1970-01-01
      相关资源
      最近更新 更多