Laravel 10本地化切换报错:调用中间件未定义setLanguage方法
问题排查与修复
核心错误原因
报错提示LocalizationMiddleware不存在setLanguage方法,是因为你把路由的处理类指向了中间件,而实际处理方法在控制器里,另外还有两处细节不匹配导致功能无法正常工作。
修复步骤
1. 修正路由配置
路由里错误地将处理方法关联到了LocalizationMiddleware,应该改为LocalizationController:
Route::get('locale/{locale}',[LocalizationController::class, 'setLanguage'])->name('locale');
确保已在路由文件顶部引入控制器:
use App\Http\Controllers\LocalizationController;
2. 统一Session键名
控制器存入Session的键是locale,但中间件读取的是selected_language,两者不匹配,修改中间件代码:
public function handle(Request $request, Closure $next): Response { // 统一使用locale作为Session键名 App::setLocale(session()->get('locale') ?? 'en'); return $next($request); }
3. 修正Blade模板的链接
模板部分链接未使用路由命名,改为通过route()生成正确URL,同时修正语言代码的小错误:
<div class="dropdown ms-1 topbar-head-dropdown header-item"> <button type="button" class="btn btn-icon btn-topbar btn-ghost-secondary rounded-circle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <img id="header-lang-img" src="{{ asset('els/images/flags/us.svg') }}" alt="Header Language" height="20" class="rounded"> </button> <div class="dropdown-menu dropdown-menu-end"> <!-- English language --> <a href="{{ route('locale', ['locale' => 'en']) }}" class="dropdown-item notify-item language py-2" data-lang="en" title="English"> <img src="{{ asset('els/images/flags/us.svg') }}" alt="user-image" class="me-2 rounded" height="18"> <span class="align-middle">English</span> </a> <!-- German Language --> <a href="{{ route('locale', ['locale' => 'de']) }}" class="dropdown-item notify-item language" data-lang="de" title="German"> <img src="{{ asset('els/images/flags/germany.svg') }}" alt="user-image" class="me-2 rounded" height="18"> <span class="align-middle">Deutsche</span> </a> </div> </div>
4. 确认中间件已注册
检查app/Http/Kernel.php的web中间件组,确保LocalizationMiddleware已注册:
protected $middlewareGroups = [ 'web' => [ // ...其他中间件 \App\Http\Middleware\LocalizationMiddleware::class, ], ];
完成修改后,执行以下命令清除缓存:
php artisan cache:clear php artisan route:clear
再测试语言切换功能即可正常工作。
内容的提问来源于stack exchange,提问作者Mahe Karim
相关产品推荐
相关产品推荐

