Laravel验证url中的区域设置是否与数据库中用户的区域设置相同

xcitsw88  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(130)

因此,在我的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()显示了正确的语言环境,但路由仍然总是默认的语言环境?当然,如何解决这个问题?

jjhzyzn0

jjhzyzn01#

通常在重定向之前你可以在登录功能中访问用户。在我的许多项目中有一个管理面板,我使用相同的默认登录端点。在登录过程中,我检查用户是否是管理员,并决定将他重定向到哪里。
下面是一个laravel 8项目中App\Http\Controllers\Auth\LoginController中的store函数示例:

/**
     * Handle an incoming authentication request.
     *
     * @param  \App\Http\Requests\Auth\LoginRequest  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(LoginRequest $request)
    {
        $request->authenticate();

        $request->session()->regenerate();

        if (Auth::user()->hasRole('admin')) {
            return redirect()->intended(RouteServiceProvider::ADMIN_HOME);
        }

        return redirect()->intended(RouteServiceProvider::HOME);
    }

所以我相信,如果你在登录控制器中编辑你的重定向逻辑,它应该可以工作,因为在你真正重定向用户之前,你已经访问了他。

相关问题