在Laravel的路由字符串中间可以有一个路由参数吗? 如标题所说:在LaaVele5.7中我的路径中有可能在字符串中间有一个路由参数吗?< /P>

在Laravel的路由字符串中间可以有一个路由参数吗? 如标题所说:在LaaVele5.7中我的路径中有可能在字符串中间有一个路由参数吗?< /P>,laravel,routes,laravel-5.7,Laravel,Routes,Laravel 5.7,我的路线定义如下: Route::get('/foos/foo-{bar}-baz', function () { return 'something'; } ->where('bar', '*+'), ->middleware(['web', MyMiddleware::class]); 我想在MyMiddleware类中访问此参数,但它总是返回null,除非我将路由定义为'/foo/{bar}/baz' 我尝试了许多不同的正则表达式组合,但都没有效果。您必须定义bar

我的路线定义如下:

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
}
->where('bar', '*+'), 
->middleware(['web', MyMiddleware::class]);
我想在
MyMiddleware
类中访问此参数,但它总是返回null,除非我将路由定义为
'/foo/{bar}/baz'


我尝试了许多不同的正则表达式组合,但都没有效果。

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

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
})
->where('bar', '[a-z0-9-]+')
->middleware(['web', MyMiddleware::class]);
$parts = explode("-", $fooBarBaz);
// do something with $parts[1]
如果我在之后访问Chrome上的
/foos/foo hello world baz
,并执行
dd($request->bar)
在我的中间件中,我收到以下输出:

hello-world

有关更多信息:

您可以完全按照所示进行操作,我刚刚测试过,它可以按预期工作

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

然后,在中间件句柄方法中,您可以获得如下值:

$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]);
您可以将其定义为(尽管其他答案似乎表明您不需要)

基本上,
/foos/
之后的任何内容都可以作为
$fooBarBaz
提供。如果
$fooBarBaz
包含类似
“foo bar baz”
的内容,您只需在
-
上分解它,然后访问参数的第二部分:

Route::get('/foos/foo-{bar}-baz', function () {
    return 'something';
})
->where('bar', '[a-z0-9-]+')
->middleware(['web', MyMiddleware::class]);
$parts = explode("-", $fooBarBaz);
// do something with $parts[1]

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

我确实定义了正则表达式。我只是没有把它包括进去。。。不幸的是,@Brandon您定义的正则表达式是什么?我尝试使用上面的正则表达式,我可以用
$request->bar
->where('bar','*+')
->where('bar','[\w]+')
->where('bar','[\w-]+')
等工具检索参数。@Brandon我刚刚尝试了
->where('bar','[\w-+')
,它仍然工作正常。您在浏览器中使用的url是什么?
mysite.test/foos/foo xyz baz
其中
xyz
是任意字符。我在整个应用程序中的所有其他路由都正常工作。这对我不起作用。无论在我的中间件中发生什么,我总是得到
null
。您能显示一下您的中间件的内容吗?我给了你我上面使用的代码,你可以试试那个,确保你没有使用不同的东西。你用什么url测试过这个?它应该返回404。@Brandon请检查我的编辑。我又考了一次。它只适用于您的自定义中间件,以防在其他中间件中剥离某些内容,我真的不知道还有什么好说的。我自己在我的项目上测试它,它确实有效。你能更新问题并显示你在
条形码的路由文件中使用的正则表达式吗?如果我不能让它以其他方式工作,我可能会走这条路线。谢谢你的回复,不用担心。只需确保它不会与其他路线冲突。通常,您会将其放在routes文件的底部,或
Route::group()
的底部,等等。