Документация Laravel 5 описывает два способа назначения промежуточного ПО :
Однако я понял, что любой код, написанный в функции контроллера __construct()
будет выполняться перед промежуточным ПО , даже если Middleware объявляется в первой строке функции __construct
контроллера.
Я нашел отчет об ошибке для аналогичной проблемы в репозитории gatarub Laravel. Однако соавтор закрыл вопрос, в котором говорится: «Это ожидаемое поведение».
Мне интересно, что middleware
должно быть «слоями» вне приложения, а функция __construct
является частью приложения. Почему функция __construct
выполняется перед промежуточным программным обеспечением (учитывая, что это является промежуточным программным обеспечением) и почему это ожидается?
Логика приложения находится в методах контроллера. Таким образом, в основном приложение работает в методах контроллера, а не во всем контроллере.
Промежуточное программное обеспечение работает до того, как запрос входит в соответствующий метод контроллера. И, таким образом, это всегда НАРУШЕНИЕ реального приложения. Никакой метод контроллера не выполняется, если все Middlewares не передают запрос.
Средство $this->middleware("My\Middleware");
операторы, которые вы ввели в конструктор контроллера, РЕГИСТРАЦИЯ My\Middleware
для проверки до того, как запрос поступит в приложение.
Если вы видите код промежуточного программного обеспечения и если запрос проходит, мы отправляем его на следующее промежуточное программное обеспечение, используя $next($request);
заявление. Это позволяет выполнять несколько промежуточных программ для одного запроса. Теперь, если Laravel запускает промежуточное ПО прямо на $this->middleware(...);
, Laravel, вероятно, не сможет узнать, какое промежуточное ПО должно быть проверено.
Итак, Laravel решает это, сначала регистрируя все средние, а затем передавая запрос через все посредники один за другим.