就像标题中所说:在Laravel 5.7中,我的路线中字符串中间是否可以有一个路线参数?
我的路线定义为:
Route::get('/foos/foo-{bar}-baz', function () {
return 'something';
}
->where('bar', '*+'),
->middleware(['web', MyMiddleware::class]);
我想在MyMiddleware
类中访问此参数,但是除非我将路由定义为'/foo/{bar}/baz'
我尝试了多种不同的正则表达式组合,但无济于事。
答案 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]);