因此,在我的LocaleMiddleware
类(位于中间件的web
组中)中,我有以下内容:
if (Auth::check())
{
app()->setLocale($request->user()->getLocale()); // This just fetches the locale from the database for the given user
}
然后它只返回下一个请求。但是,有一个小问题,例如当登录时。我需要使用return redirect()->intended();
选项。这会带来一个问题,例如当我指向以下路由时:
https://www.example.com/es/cervezas/dos
此url的英文变体为:
https://www.example.com/en/beers/two
例如,我的路线如下所示:
Route::name('user.')->prefix(app()->getLocale())->group(function () {
Route::get(trans('routes.beers'), [BeersController::class, 'index'])->name('beers.index');
}
所以在我的路线我翻译一切,我也有我的每个数据库模型等的蛞蝓,这就是为什么我总是需要有正确的区域设置,但我也总是需要有正确的区域设置在网址.如果没有我得到找不到异常时,查看特定的模型项目或怪异的翻译.
但主要问题之一是,例如,当我转到西班牙语路线(或任何语言的任何路线)时,在登录后,它将返回预期的url/route,这将是英语的,因为en
是备用语言环境。
所以基本上,我在想的是类似的东西,在我的LocaleMiddleware
类中:
if (Auth::check())
{
app()->setLocale($request->user()->getLocale());
// Check if the segment locale is the same as the user locale
// IF NOT, redirect them
if(request()->segment(1) !== $request->user()->getLang())
{
return redirect()->route(request()->route()->getName()); // Not sure what to do here, doing this just creates an endless loop because the locale somehow was not updated yet it seems
}
}
有什么想法来解决这个问题,在LocaleMiddleware
或其他任何地方?或者我是不是完全走错了路?任何指针都很感激!
- 编辑:**
现在,在我的LoginController中,我有以下内容:
protected function authenticated(Request $request, $user)
{
app()->setlocale($user->getLocale());
dd(app()->getLocale()); // This is the correct locale, `es` or `nl`
dd(route('beers.index')); // This just always shows the English route
}
为什么app()->getLocale()
显示了正确的语言环境,但路由仍然总是默认的语言环境?当然,如何解决这个问题?
1条答案
按热度按时间jjhzyzn01#
通常在重定向之前你可以在登录功能中访问用户。在我的许多项目中有一个管理面板,我使用相同的默认登录端点。在登录过程中,我检查用户是否是管理员,并决定将他重定向到哪里。
下面是一个laravel 8项目中App\Http\Controllers\Auth\LoginController中的store函数示例:
所以我相信,如果你在登录控制器中编辑你的重定向逻辑,它应该可以工作,因为在你真正重定向用户之前,你已经访问了他。