Laravel 中间件不执行函数

Laravel Middleware not executing functions

我有这个 Locale 中间件,它根据 DB 上的设置设置语言

    public function handle($request, Closure $next)
    {
        $HQ = Branch::where('is_hq', 1)->where('is_active', 1)->first();

        $Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
        $locale = strtolower($Company['bi__language']->value);

        if ($locale === 'eng') {
            \App::setlocale('en');
        } else {
            \App::setlocale($locale);
        }

        return $next($request);
    }

但我需要获取当前用户所在的分支,所以我需要先获取 Auth::id() 所以我将代码更改为此以访问 Auth .

     public function handle($request, Closure $next)
     {
        $response = $next($request);

        $HQ = Branch::where('is_hq', 1)->where('is_active', 1)->where('user_id', \Auth::id())->first();

        $Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
        $locale = strtolower($Company['bi__language']->value);

        if ($locale === 'eng') {
            \App::setlocale('en');
        } else {
            \App::setlocale($locale);
        }

        return $response;
    }

现在我正在让当前用户登录,但问题是它没有执行这段代码

if ($locale === 'eng') {
   \App::setlocale('en');
} else {
    \App::setlocale($locale);
}

Kernel.php

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
    \App\Http\Middleware\TrimStrings::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
    \App\Http\Middleware\TrustProxies::class,
    \Barryvdh\Cors\HandleCors::class,
    \App\Http\Middleware\Locale::class,
];

Note: the code wihout Auth is executing this block of code but the second isn't

我是不是遗漏了什么?

你有第二个

$response = $next($request);

在最开始,所以代码会在response执行。

你需要做这样的事情:

    public function handle($request, Closure $next)
    {
        $HQ = Branch::where('is_hq', 1)->where('is_active', 1)->where('user_id', \Auth::id())->first();
        $Company = GlobalVariable()->branch($HQ)->all()->whereIn('group', array(1, 3, 9))->keyBy('key');
        $locale = strtolower($Company['bi__language']->value);

        if ($locale === 'eng') {
            \App::setlocale('en');
        } else {
            \App::setlocale($locale);
        }

        return $next($request);
    }

如果没有auth()->user(),那是因为你注册中间件的地方不对。

全局中间件堆栈在会话启动和身份验证详细信息可用之前运行。

在 'web' 组底部或您的路由中间件中定义它。

    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
            \App\Http\Middleware\Locale::class,
        ],

        'api' => [
            'throttle:60,1',
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];