Laravel如何从子路由设置父路由组参数?{locale}参数问题
解决Laravel子路由切换父路由locale参数的问题
我来帮你搞定这个问题!你遇到的错误根源很明确:当当前路由是projects.single时,这个路由需要两个必填参数:{locale}和{slug},但你在生成链接时只传入了$locale,漏掉了slug参数,所以Laravel抛出了参数缺失的错误。
问题分析
你的路由结构里,projects.single的完整URI是{locale}/projects/{slug},意味着调用route('projects.single')时必须同时传入locale和slug两个参数。而你当前的代码只传了$locale,自然会触发参数缺失的报错。
解决方案
我们需要在生成切换语言的链接时,保留当前路由的所有现有参数,只替换其中的locale值。这样不管当前是哪个路由(包括需要额外参数的projects.single),都能正确生成带全参数的链接。
修改你的header.blade.php代码如下:
@foreach (config('app.available_locales') as $locale) <li class="nav-item"> <a class="nav-link" href="{{ route(Route::currentRouteName(), array_merge(Route::current()->parameters(), ['locale' => $locale])) }}" @if (app()->getLocale() == $locale) style="font-weight: bold; text-decoration: underline" @endif> {{ strtoupper($locale) }} </a> </li> @endforeach
代码解释
Route::current()->parameters():获取当前路由的所有参数(比如在projects.single页面时,会拿到['locale' => 'en', 'slug' => 'my-project']这样的数组)array_merge(..., ['locale' => $locale]):把当前参数数组里的locale替换成循环中的目标语言,其他参数保持不变- 这样调用
route()方法时,就能传入完整的参数列表,满足所有路由的参数要求
额外注意事项
- 如果你的项目中有用到命名路由但没有参数的情况(比如
home),这个方法同样适用,因为array_merge只会替换存在的locale参数,不会影响其他无参数路由。 - 无需额外引入
Route门面,上面的代码直接使用了Laravel的全局路由辅助能力。
内容的提问来源于stack exchange,提问作者Asatur
相关产品推荐
相关产品推荐

