在Laravel中的路由字符串中间可以有一个路由参数吗?

时间:2019-07-02 17:34:48

标签: laravel routes laravel-5.7

就像标题中所说:在Laravel 5.7中,我的路线中字符串中间是否可以有一个路线参数?

我的路线定义为:

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
}
->where('bar', '*+'), 
->middleware(['web', MyMiddleware::class]);

我想在MyMiddleware类中访问此参数,但是除非我将路由定义为'/foo/{bar}/baz'

,否则它始终返回null。

我尝试了多种不同的正则表达式组合,但无济于事。

3 个答案:

答案 0 :(得分:1)

可以将其定义为(尽管其他答案似乎表明您不需要)

Route::get("/foos/{foo-bar-baz}", function($fooBarBaz){
  return "something";
});

基本上,/foos/之后的任何内容都可以作为$fooBarBaz使用。如果$fooBarBaz包含类似"foo-bar-baz"的内容,则可以在-上将其爆炸并访问参数的第二部分:

$parts = explode("-", $fooBarBaz);
// do something with $parts[1]

还应该可以对参数进行正则表达式约束以确保其为特定格式,例如foo-[a-zA-z]-baz等。

答案 1 :(得分:0)

您必须定义bar参数的正则表达式:

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
})
->where('bar', '[a-z0-9-]+')
->middleware(['web', MyMiddleware::class]);

如果我随后在Chrome上访问/foos/foo-hello-world-baz,并在中间件中执行dd($request->bar);,则会收到以下输出:

hello-world

有关更多信息:https://laravel.com/docs/5.8/routing#parameters-regular-expression-constraints

答案 2 :(得分:0)

您可以按照显示的方式进行操作,我刚刚进行了测试,它可以按预期运行。

首先,在app\Http\Kernel.php文件中注册中间件。

然后在中间件处理方法中,您可以这样获得bar值:

$request->route('bar');

我用它来测试:

Route::get('/foos/foo-{bar}-baz', function($bar) {
   dd($bar);
})->middleware(['mym' => function($request, $handle) {
    dd($request->route('bar'), 'Test within middleware');
}]);

鉴于您的中间件都再次为我返回了值,您可以尝试向路由添加完整的名称空间吗?

->middleware(['web', \App\Http\Middleware\MyMiddleware::class]);