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

Архитектура любого серверного веб-фреймворка опирается на особенности протокола HTTP. Сюда входят понятия запроса (request) и ответа (response). Это значит, что каждому веб-фреймворку приходится реализовывать эти объекты у себя, повторяя то, что уже было сделано в других местах.

Чтобы избежать такой ситуации, был разработан стандарт PSR7. Цель PSR-7 — предоставить общий набор интерфейсов для фреймворков, чтобы последние могли использовать одинаковые абстракции. Это позволит разработчикам писать переиспользуемый, независимый от фреймворка код. Сам стандарт объемный, и не имеет смысла его дублировать. В этом уроке мы поговорим только о ключевых особенностях.

Request и Response с точки зрения стандарта — это абстракция поверх механизмов, встроенных в сам PHP. Например, они полностью заменяют собой суперглобальные массивы, механизм загрузки файлов и многое другое.

Объекты запроса и ответа во фреймворке Slim имеют интерфейс, соответствующий стандарту PSR-7. Пример на главной странице фреймворка демонстрирует это:

getBody() возвращает специальный объект-поток (stream). Этот объект можно изменять, записывая туда данные.

Интерфейсы, описанные в PSR7, эмулируют работу HTTP. С помощью их методов можно извлечь любую информацию из запроса и создать любой ответ.

Эти методы работают не только для запроса, но и для ответа. Оба интерфейса Request и Response имеют общую часть, которая называется Message. Получается, что многие методы повторяются и одинаково работают в каждом из этих объектов.

Названия заголовков в PSR-7 регистронезависимы. В самом PHP заголовки всегда переводятся в верхний регистр и хранятся в массиве $_SERVER с префиксом HTTP_:

Response

Ответ аккумулирует внутри себя то, что отправится клиенту, но он изначально не пустой, а содержит некоторые разумные умолчания:

А вот с изменением все не так просто. Главная отличительная черта этого интерфейса в том, что он построен в иммутабельном (неизменяемом) стиле и реализует текучий интерфейс (fluent interface). Ответ невозможно изменить. Вместо этого всегда возвращается новый объект:

По этой причине во фреймворках, поддерживающих стандарт PSR-7, обработчик запроса всегда должен вернуть объект ответа. Только в этом случае фреймворк узнает о том, как надо ответить на запрос:

Единственная часть в Response, которую можно менять, – тело ответа. Это связано с техническими особенностями работы потоков в самом PHP. Подробнее об этом можно прочитать в документации.

При этом PSR7 достаточно низкоуровневый стандарт. У него нет цели сделать работу с объектами ответа и запроса максимально удобной и простой. Задача была в эмуляции поведения HTTP. Поэтому помимо реализации стандартных интерфейсов многие фреймворки создают дополнительные обертки поверх PSR7.

Эти обертки дают много прикладных полезных методов. Одну из таких оберток мы начали использовать с самого начала: Slim-Http. Вот лишь небольшой список полезных функций этой библиотеки, которые мы либо использовали, либо будем использовать:

  • Response::write($data) — изменяет ответ
  • Response::withRedirect($url, $status)
  • ServerRequest::getParam($key, $default)
  • ServerRequest::getParsedBody()