Laravel Voyager添加{lang}前缀路由报错:缺少参数
解决Voyager后台路由缺少{lang}参数的问题
直接修改Voyager路由文件(不推荐,更新会覆盖)
在vendor/tcg/voyager/routes/voyager.php中,找到最外层的路由分组,为其添加{lang}前缀:
原代码:
Route::group(['as' => 'voyager.'], function () {
修改后:
Route::group(['as' => 'voyager.', 'prefix' => '{lang}'], function () {
此修改会让所有Voyager路由都带上{lang}前缀,例如后台仪表盘路由变为/{lang}/admin(假设Voyager配置中的prefix是admin)。
推荐方案:修改Voyager配置(无vendor文件编辑)
直接修改配置文件更安全,不会在Voyager更新时被覆盖:
- 打开
config/voyager.php,找到prefix配置项:'prefix' => 'admin', - 修改为包含
{lang}的前缀:'prefix' => '{lang}/admin',
可选:让语言参数默认生效
如果希望访问/admin时自动使用系统默认语言(无需显式传入{lang}),可以将前缀改为可选参数:
'prefix' => '{lang?}/admin',
后续配置
- 限制语言参数范围:在
app/Providers/RouteServiceProvider.php的boot方法中添加语言参数的正则约束,避免无效语言值:public function boot() { Route::pattern('lang', 'en|zh-CN|zh-TW'); // 替换为你支持的语言代码 parent::boot(); } - 语言切换中间件:创建一个中间件,根据
{lang}参数设置应用的本地化语言:
将此中间件注册到<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; class SetLocale { public function handle($request, Closure $next) { // 使用路由参数中的语言,若无则使用系统默认语言 $lang = $request->route('lang') ?? config('app.locale'); App::setLocale($lang); return $next($request); } }app/Http/Kernel.php的web中间件组中。 - 生成带语言参数的URL:在生成Voyager路由链接时,需传入
lang参数(可选参数可省略,系统会自动使用默认值):// 显式传入语言 route('voyager.dashboard', ['lang' => 'en']); // 使用当前应用语言 route('voyager.dashboard', ['lang' => app()->getLocale()]); // 可选参数下可直接调用 route('voyager.dashboard');
内容的提问来源于stack exchange,提问作者Eric SsSnake
相关产品推荐
相关产品推荐

