Выполнение заказа промежуточного ПО в Laravel 5

Документация Laravel 5 описывает два способа назначения промежуточного ПО :

  1. Назначьте промежуточное ПО на маршрут контроллера.
  2. Укажите промежуточное ПО в конструкторе вашего контроллера.

Однако я понял, что любой код, написанный в функции контроллера __construct() будет выполняться перед промежуточным ПО , даже если Middleware объявляется в первой строке функции __construct контроллера.

Я нашел отчет об ошибке для аналогичной проблемы в репозитории gatarub Laravel. Однако соавтор закрыл вопрос, в котором говорится: «Это ожидаемое поведение».

Мне интересно, что middleware должно быть «слоями» вне приложения, а функция __construct является частью приложения. Почему функция __construct выполняется перед промежуточным программным обеспечением (учитывая, что это является промежуточным программным обеспечением) и почему это ожидается?

Логика приложения находится в методах контроллера. Таким образом, в основном приложение работает в методах контроллера, а не во всем контроллере.

Промежуточное программное обеспечение работает до того, как запрос входит в соответствующий метод контроллера. И, таким образом, это всегда НАРУШЕНИЕ реального приложения. Никакой метод контроллера не выполняется, если все Middlewares не передают запрос.

Средство $this->middleware("My\Middleware"); операторы, которые вы ввели в конструктор контроллера, РЕГИСТРАЦИЯ My\Middleware для проверки до того, как запрос поступит в приложение.

Если вы видите код промежуточного программного обеспечения и если запрос проходит, мы отправляем его на следующее промежуточное программное обеспечение, используя $next($request); заявление. Это позволяет выполнять несколько промежуточных программ для одного запроса. Теперь, если Laravel запускает промежуточное ПО прямо на $this->middleware(...); , Laravel, вероятно, не сможет узнать, какое промежуточное ПО должно быть проверено.

Итак, Laravel решает это, сначала регистрируя все средние, а затем передавая запрос через все посредники один за другим.