Промежуточное ПО Laravel не запускается перед каждым запросом - PullRequest
0 голосов
/ 03 ноября 2018

У меня есть это простое промежуточное ПО

<?php

namespace App\Http\Middleware;

use Closure;
use Session;
use App;

class SetPageLanguage
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {

        if(Session::has('language'))
        {
            $lang = Session::get('language');

            App::setLocale($lang); // still don't know which one to use, but I'll figure it out ;)
            app()->setLocale($lang);
        }

        return $next($request);
    }
}

Который должен запускаться перед каждым запросом. Поэтому я добавил его в ядро:

class Kernel extends HttpKernel
{

    protected $middleware = [

        ...

        \App\Http\Middleware\SetPageLanguage::class, // middleware for setting the language when loading a page
    ];

Но это не работает. Это никогда не работает.

С другой стороны, если я положу его в routeMiddleware, примерно так:

 protected $routeMiddleware = [

        ...

        'localization' => \App\Http\Middleware\SetPageLanguage::class,

        ...

И вызывать его на каждом маршруте, например:

Route::GET('/', 'AnonymController@home')->middleware('localization');

Работает отлично! Но я не хочу этого делать. Я хочу, чтобы он запускался автоматически перед каждым запросом, как и предполагалось. Чего мне не хватает?

Я довольно новичок в laravel и Php, поэтому я уверен, что не понимаю чего-то важного.

Я просмотрел несколько руководств, прочитал несколько статей и искал ответ здесь, в Переполнении стека. Все еще не могу понять это.

Как мне запустить промежуточное ПО перед каждым запросом?

Спасибо.

1 Ответ

0 голосов
/ 03 ноября 2018

Вероятно, он работает, но глобальное промежуточное ПО запускается до промежуточного промежуточного ПО. Важно понимать, что делает другое промежуточное программное обеспечение и в каком порядке они называются.

Если вы посмотрите на группу промежуточного ПО 'web', вы увидите это промежуточное ПО:

\Illuminate\Session\Middleware\StartSession::class,

Сессии не доступны сразу в приложении Laravel. Промежуточное программное обеспечение StartSession - это то, что запускает сеансы для веб-маршрутов. Маршруты API не используют сеансы, потому что они не сохраняют состояние.

Следовательно, это промежуточное программное обеспечение, вероятно, принадлежит к веб-группе ниже промежуточного программного обеспечения сеанса, поскольку оно опирается на данные сеанса.

...