Промежуточное ПО Laravel до регистрации маршрутов

Я разрабатываю приложение Laravel. Теперь я пытаюсь создать промежуточное программное обеспечение, которое проверяется до регистрации любых маршрутов. Логически, это то, что я пытаюсь сделать. У меня есть список маршрутов, сохраненных в базе данных. Imaging, для него существует модель Redirection. В промежуточном программном обеспечении я хочу проверить, если запрошенный путь попадает в одно из перенаправлений в базе данных, я буду перенаправлять на другой путь. Теперь я создал промежуточное ПО под названием RedirectMiddleware. Затем я зарегистрировал его в классе ядра следующим образом:

protected $middlewareGroups = [
        'web' => [
            RedirectMiddleware::class,
        ],
        'api' => [
            //other stuff
        ],
    ];

Проблема в том, что когда я обращаюсь к несуществующему маршруту, он отображает страницу ошибки 404 без предварительного прохождения промежуточного программного обеспечения. Как я могу создать/зарегистрировать промежуточное ПО, которое вызывается до регистрации каких-либо маршрутов? Или что может быть лучшим подходом для достижения того, чего я хочу, вместо использования промежуточного программного обеспечения?


person Wai Yan Hein    schedule 19.07.2019    source источник
comment
Маршрут должен существовать, чтобы вы могли проверить путь.   -  person adam    schedule 19.07.2019
comment
Рассмотрим запасной маршрут?   -  person ceejayoz    schedule 19.07.2019


Ответы (1)


В Laravel ядро ​​HTTP обрабатывает регистрацию промежуточного программного обеспечения. Но чтобы зарегистрировать его, вы должны войти в конфигурацию, как у вас. При регистрации подбирает нужную конфигурацию из файла App\Http\Kernel.php. Там нам нужно обратить внимание на наше пространство имен. Laravel читает только то, что находится в пространстве имен App\Http. Когда вы вызываете свое промежуточное ПО, вы пытаетесь ссылаться на него относительно, как будто оно находится в текущем пространстве имен.

protected $middlewareGroups = [
        'web' => [
            RedirectMiddleware::class,
        ],
        'api' => [
            //other stuff
        ],
    ];

Что вам нужно делать, так это ссылаться на него напрямую. Для этого вам нужно выйти из пространства имен и указать путь. Вот так...

protected $middlewareGroups = [
        'web' => [
             // Your other middlewares
             \App\Http\Middleware\RedirectMiddleware::class,
        ],
        'api' => [
            //other stuff
        ],
    ];

Это должно решить вашу проблему. Если нет, дайте мне знать и опубликуйте свое промежуточное ПО, чтобы мы могли видеть, что именно вы делаете.

-- Текущие документы Laravel 19.07.2019 :: https://laravel.com/docs/5.8/middleware#registering-middleware

person Brent Dalling    schedule 19.07.2019