Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Встроенные посредники

Несколько посредников входят в сам 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(), а не в конец файла.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.