Веб-разработка на PHP
Теория: Стандарт PSR7
Архитектура любого серверного веб-фреймворка опирается на особенности протокола 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()
.png)
