如何为Laravel路由参数提供选择


How to provide choices for Laravel route parameter

我试图实现的是,我有一个接受名为type的参数的路由,它现在接受任何值。但我想提供接受来自的值的选择,如果匹配路由有效,否则会抛出未找到的错误。

选择包括:

  1. 转发
  2. 收藏夹
  3. 推特

代码:

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

ActivitiesController.php

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

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

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

这将检查$type。如果它不合适,它将重定向到404错误页面:

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');

此外,您还可以使用中间件。选择权在你。)