Веб-разработка на PHP
2026-02-26 23:11 Diff

Каждая HTTP-сессия определяется двумя вещами: запросом и ответом. Запрос формируется клиентом, например, браузером, а ответ — сервером.

В PHP для работы с http-сессией встроено множество глобальных массивов, но их использование во фреймворках не допускается. Это технически можно, но это «злое» программирование.

И запрос и ответ в Slim представлены двумя объектами, которые передаются в каждый обработчик маршрута.

$request используется для извлечения данных запроса, например, заголовков или содержимого отправленной формы. У запроса нет сеттеров. Его уже выполнили и он не может поменяться.

В противоположность этому $response используется для формирования ответа и в процессе работы наполняется данными: заголовками и телом.

Тело ответа хранится внутри $response как объект, который можно получить через метод getBody(). А метод write() записывает данные в этот объект. Такая структура объектов выбрана не просто так. HTTP позволяет отдавать данные потоком (чанками), для которых нужны свои методы работы.

Несмотря на то, что объект с телом ответа может меняться, сам $response никогда не изменяется. Любой его метод формирует новый $response:

Если не знать этого, можно легко допустить такую ошибку:

В этом коде withStatus() возвращает новый $response, который не используется, а наружу возвращается старый. Если попробовать выполнить запрос к этому обработчику, то он вернет изначально переданный в функцию $response.

Параметры запроса

Параметры запроса не являются частью маршрута и не влияют на выбор обработчика. Связано это с тем, что такие параметры используются для различных вспомогательных целей, например, параметр page обозначает страницу просматриваемого списка. Обработчик в такой ситуации всегда один и тот же, а вот данные показываются разные.

Параметры извлекаются из объекта $request несколькими способами:

  • getQueryParams() — извлекает все параметры
  • getQueryParam($name, $defaultValue) — извлекает значение конкретного параметра. Вторым параметром принимает значение по умолчанию

Количество обработчиков и маршрутов, которые можно добавить, не ограничено. При этом микрофреймворки не задают никакой структуры. Если кода становится много, то разделять его по файлам придется самостоятельно.