Встроенные посредники
Несколько посредников входят в сам Slim, устанавливать их не нужно. Три из них подключают почти в каждом приложении — в файле config/middleware.php.
Разбор тела запроса
// config/middleware.php
use Slim\App;
return function (App $app): void {
$app->addBodyParsingMiddleware();
};Этот посредник читает тело запроса и превращает его в массив, который возвращает $request->getParsedBody(). Он понимает JSON, данные форм и XML — формат определяется по заголовку Content-Type. Без него JSON-запрос придёт в действие неразобранным.
Маршрутизация
$app->addRoutingMiddleware();Маршрутизация — поиск маршрута, подходящего запросу. Slim выполнит её и без этой строки, но в самый последний момент. Явный вызов задаёт место в цепочке: посредники, добавленные раньше него, уже знают, какой маршрут найден, и могут строить ссылки через RouteContext.
Обработка ошибок
$app->addErrorMiddleware(true, true, true);Посредник ошибок перехватывает любое исключение и превращает его в ответ: 404 для несуществующего адреса, 405 для неподходящего метода, 500 для ошибки в коде.
| Аргумент | Что включает |
|---|---|
| Первый | Показывать подробности ошибки на странице |
| Второй | Записывать ошибки в журнал |
| Третий | Записывать в журнал и подробности |
Подробности на странице нужны только при разработке, поэтому первый аргумент берут из настроек.
Всё вместе
Файл config/middleware.php в проекте блога выглядит так:
// config/middleware.php
use App\Middleware\ResponseTimeMiddleware;
use Slim\App;
return function (App $app): void {
$settings = $app->getContainer()->get('settings');
$app->add(ResponseTimeMiddleware::class);
$app->addBodyParsingMiddleware();
$app->addRoutingMiddleware();
$app->addErrorMiddleware($settings['debug'], true, true);
};Порядок важен. Добавленный последним посредник выполняется первым, поэтому посредник ошибок стоит в конце файла: он охватывает все остальные слои и перехватывает исключения из любого из них. Свои посредники добавляют выше трёх встроенных.
Проверка
Откройте несуществующий адрес, например http://localhost:8080/nothing. При APP_DEBUG=true появится страница «404 Not Found» с подробностями. Замените значение в .env на false — останется только короткое сообщение.
Другие встроенные посредники
| Класс | Что делает |
|---|---|
Slim\Middleware\MethodOverrideMiddleware | Позволяет форме отправить PUT или DELETE через скрытое поле _METHOD |
Slim\Middleware\ContentLengthMiddleware | Добавляет к ответу заголовок Content-Length |
Их подключают через $app->add(new MethodOverrideMiddleware()). Посредник подмены метода добавляют после addRoutingMiddleware(): метод должен быть подменён до поиска маршрута.
Частая ошибка
Если добавить посредник ошибок не последним, исключения из слоёв, добавленных после него, он не перехватит: посетитель увидит пустую страницу или сырую ошибку PHP. Новые посредники вписывайте выше строки addErrorMiddleware(), а не в конец файла.