Laravel 5.5 LoginController中redirectTo配置不生效,寻求技术帮助
Laravel登录后跳转到多语言路由问题解决
我之前也碰到过直接设置$redirectTo变量没效果的情况,大概率是因为多语言路由需要动态生成地址,而静态变量没法满足这个需求。下面给你几个靠谱的解决思路:
1. 用redirectTo()方法代替静态变量
Laravel的LoginController里,redirectTo既可以是静态变量,也可以是动态方法。如果你的多语言路由是/{lang}/dashboard这种带参数的形式,必须用方法来动态计算重定向地址:
在你的LoginController里添加这个方法:
protected function redirectTo() { // 获取语言标识:优先取session里的语言,没有就用应用默认语言 $locale = session('locale', app()->getLocale()); // 生成带语言参数的路由地址(这里假设你的后台首页路由名称是dashboard) return route('dashboard', ['lang' => $locale]); }
配套路由设置
要确保你的路由已经正确定义了带语言参数的前缀,比如:
// routes/web.php Route::prefix('{lang}')->middleware('locale')->group(function () { // 后台首页路由,命名为dashboard Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); // 其他多语言路由... });
语言中间件配置
还要写一个locale中间件来处理路由里的语言参数,把它设置为应用当前语言并存在session里:
// app/Http/Middleware/LocaleMiddleware.php public function handle(Request $request, Closure $next) { if ($request->route('lang')) { // 设置应用语言 app()->setLocale($request->route('lang')); // 把语言存在session,下次登录可以直接用 session()->put('locale', $request->route('lang')); } return $next($request); }
记得在app/Http/Kernel.php的web中间件组里注册这个中间件。
2. 检查是否被authenticated()方法覆盖
如果你的LoginController里自定义了authenticated()方法,这个方法的返回值会优先于redirectTo生效。如果是这种情况,直接在这个方法里返回多语言重定向就行:
protected function authenticated(Request $request, $user) { $locale = session('locale', app()->getLocale()); // 跳转到带语言参数的后台首页 return redirect()->route('dashboard', ['lang' => $locale]); }
如果不需要在authenticated()里做其他逻辑,删掉这个方法就行,让redirectTo()方法正常工作。
3. 针对用户自定义语言的情况
如果你的用户表有language字段,要根据用户自己的语言设置跳转,只需修改redirectTo()方法里的语言获取逻辑:
protected function redirectTo() { // 优先取用户的自定义语言,没有就用应用默认语言 $locale = auth()->user()->language ?? app()->getLocale(); return route('dashboard', ['lang' => $locale]); }
内容的提问来源于stack exchange,提问作者diego
相关产品推荐
相关产品推荐

