Laravel登录后跳转首页时传递locale参数的实现方案咨询
解决登录后跳转首页带locale参数的问题
我来帮你搞定这个登录跳转带locale的问题~核心是要动态处理跳转路径,同时把用户选择的locale持久化存储,具体可以按下面的步骤操作:
1. 统一处理Locale的中间件
首先我们可以创建一个中间件,避免每个路由重复写App::setLocale($locale),还能把locale存在session里,方便后续登录后调用:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\App; class SetLocale { public function handle($request, Closure $next) { // 优先级:路由参数里的locale > session存储的locale > 系统默认语言 $locale = $request->route('locale') ?? session('locale') ?? config('app.fallback_locale'); App::setLocale($locale); session(['locale' => $locale]); // 把当前locale存入session return $next($request); } }
2. 注册中间件
打开app/Http/Kernel.php,把刚才的中间件加到web中间件组里,这样所有web路由都会自动处理locale:
protected $middlewareGroups = [ 'web' => [ // ... 其他已有的中间件 \App\Http\Middleware\SetLocale::class, ], ];
做完这一步,你就可以删掉原来路由和控制器里的App::setLocale($locale)代码了,逻辑统一维护更省心~
3. 重写登录跳转逻辑
Laravel默认用RouteServiceProvider里的静态HOME常量跳转,但这个没法带动态参数。我们在LoginController里重写redirectTo方法,动态生成带locale的首页路径:
打开app/Http/Controllers/Auth/LoginController.php,添加以下方法:
/** * 登录成功后的跳转路径 * * @return string */ protected function redirectTo() { // 从session取出之前存储的locale,没有则用系统默认语言 $locale = session('locale') ?? config('app.fallback_locale'); return "/{$locale}/home"; }
4. (可选)完善登录路由
为了让用户从带locale的登录页进入,给登录路由也加上locale参数,和注册路由保持一致:
Route::get('{locale}/login', function ($locale) { return view('auth.login', ['locale' => $locale]); })->name('login_lang')->middleware('guest');
这样用户访问/pt/login或/en/login登录后,session里已经有对应locale,跳转时就会自动带上/pt/home或/en/home啦。
如果还有其他跳转场景(比如注册成功后),也可以用同样的逻辑在对应控制器里重写redirectTo方法哦~
内容的提问来源于stack exchange,提问作者Miguel de Sousa Ferreira
相关产品推荐
相关产品推荐

