Основная информация о посредниках (англ. middleware) в фреймворке Laravel-5 довольно подробно приведена в документации. Но на практике бывает нужно решать довольно специфические задачи в т.ч. касающиеся посредников. Вот мне потребовалось найти ошибку работы одного расширения, при установке которого переставали работать определенные функции, а именно - переменная $errors, которая всегда должна быть доступна во всех представлениях при каждом запросе, оказывалась не определена в шаблоне, что выдавало ошибку. Немного погуглив выяснилось, что переменная $errors привязывается к представлению посредником Illuminate\View\Middleware\ShareErrorsFromSession, который входит в состав группы посредников web. И небольшим логическим заключением я пришел к идее проверить - а привязана ли группа посредников "web" к моему маршруту?! Как оказалось - не привязана. Вот про то как это можно легко и быстро проверить, а так же какие еще есть функции по работе с посредниками - в этой заметке.

Для вывода информации о посредниках можно добавить ниже приведенный код в действие нужного контроллера, например в действие index() IndexController.

Вывести на экран всю информацию по маршрутам в т.ч. все существующие посредники:
dump(app('router'));


При этом, на экране можно увидеть какие стандартные посредники есть в системе, существующие группы посредников (тут это web и api) и приоритет посредников – в каком порядке они применяются.

Но чаще всего интересует информация касающаяся какого-то конкретного маршрута, например отвечающего за вывод главной страницы.
Вывести инфо по текущему маршруту:
dump(\Route::current());

В данном случае это будет маршрут:
Route::get('/', 'IndexController@index')->name('main');

Откроется вывод информации по объекту текущего маршрута Illuminate\Routing\Route, где можно увидеть привязанные посредники. Они могут быть в свойстве "action" и в свойстве "controller" (если привязка посредника была в контроллере).




Получив свойство computedMiddleware можно посмотреть в целом, что привязано к данному маршруту.
dump(\Route::current()->computedMiddleware);


И это самая нужная информация для анализа.

Итого, у меня к маршруту, ответственному за вывод главной страницы, привязано 3 посредника, а если точнее, то «web» это группа стандартных посредников (состав можно смотреть и корректировать в файле app/Http/Kernel.php). Группа посредников “web” отвечается за работу с куками, сессиями, валидацией, передачей ошибок и др. Посредник LocaleMiddleware связан с работой моего расширения по созданию мультиязычного приложения, а посредник Featured у меня, в данном проекте, привязан в конструкторе контроллера и выполняет сохранение в сессию определенных данных.



В файле vendor\laravel\framework\src\Illuminate\Routing\Router.php можно посмотреть различные методы работы с посредниками существующими в приложении.
Например:
  • просмотреть существующие группы посредников – метод getMiddlewareGroups();
  • зарегистрировать группу – метод middlewareGroup($name, array $middleware);
  • добавить своего посредника в начало существующей группы – метод prependMiddlewareToGroup($group, $middleware);
  • добавить своего посредника в конец существующей группы – метод pushMiddlewareToGroup($group, $middleware).

Данные методы вызываются у объекта маршрутизатора Illuminate\Routing\Router:
dump(app('router')->getMiddlewareGroups());

В файле vendor\laravel\framework\src\Illuminate\Routing\Route.php можно посмотреть (получить) какие есть методы для работы с посредниками касающимися отдельных маршрутов.
Например:
  • посмотреть какие посредники привязаны к маршруту – метод gatherMiddleware(). Вместо него, выше я использовал свойство computedMiddleware.
  • посмотреть или установить (если передать в аргументах) посредники (без учета привязанных в контроллере) – метод middleware($middleware = null);
  • посмотреть какие посредники были привязаны именно в контроллере – метод controllerMiddleware().

Данные методы нужно вызывать получив объект нужного маршрута. Например разместив в действии нужного контроллера получим его маршрут и сможем вызвать нужный метод:
dump(\Route::current()->gatherMiddleware());