Middleware (контроллер-посредник) представляет собой разновидность контроллера, но его основное назначение — не вывод ожидаемого ответа пользователю (хотя middleware может возвращать текст ошибок), а выполнение определённых задач перед тем или после того, как этот ответ будет сформирован.
В отличие от контроллера, этот посредник может быть назначен не только к маршруту, но и к группе маршрутов. И там и там может быть несколько разных middleware (и даже одинаковых, если вдруг такое понадобится).
Например, авторизация пользователей может быть реализована в middleware и применена к группе маршрутов, где она необходима.
Ещё до выполнения контроллера или иного основного действия, прикреплённого к маршруту, будет определён текущий пользователь и статус его авторизации.
В противном случае класс-посредник передаст выполнение другому контроллеру, вернет ошибку или перенаправит на иной маршрут, в зависимости от реализации.
Когда middleware() метод (варианты after() или before()) применяется в маршруте, он имеет аргумент data. Это еще одно отличие от контроллера, в этот аргумент можно передать массив, который затем будет доступен в middleware. Данные массива доступны в методе Hleb\Static\Router::data() или через контейнер.
Класс middleware должен быть унаследован от Hleb\Base\Middleware.
Как правило, предназначение вызванного метода этого класса не возвращать что-либо, а проверять условия. Но в некоторых случаях предусмотрен возврат значения.
string|int|float - эти типы будут преобразованы в строку и выведены в исходном виде как текст.
array - возвращаемый массив будет преобразован в JSON-строку. После этого дальнейшее выполнение прерывается.
bool - если возвращается false, то это равносильно прерыванию дальнейшего выполнения.
Кроме копирования демонстрационного файла DefaultMiddleware.php и его изменения, есть еще один простой способ создания нужного класса с использованием консольной команды.
$php console --add middleware ExampleMiddleware
Эта команда создаст новый шаблон /app/Middlewares/ExampleMiddleware.php.
Можно использовать другое подходящее название для класса.
Фреймворк HLEB2 позволяет также создать собственный шаблон по умолчанию для этой команды.