HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Архитектура любого серверного веб-фреймворка опирается на особенности протокола HTTP. Сюда входят понятия запроса (request) и ответа (response). Это значит, что каждому веб-фреймворку приходится реализовывать эти объекты у себя, повторяя то, что уже было сделано в других местах.</p>
1 <p>Архитектура любого серверного веб-фреймворка опирается на особенности протокола HTTP. Сюда входят понятия запроса (request) и ответа (response). Это значит, что каждому веб-фреймворку приходится реализовывать эти объекты у себя, повторяя то, что уже было сделано в других местах.</p>
2 <p>Чтобы избежать такой ситуации, был разработан стандарт PSR7. Цель PSR-7 - предоставить общий набор интерфейсов для фреймворков, чтобы последние могли использовать одинаковые абстракции. Это позволит разработчикам писать переиспользуемый, независимый от фреймворка код. Сам стандарт объемный, и не имеет смысла его дублировать. В этом уроке мы поговорим только о ключевых особенностях.</p>
2 <p>Чтобы избежать такой ситуации, был разработан стандарт PSR7. Цель PSR-7 - предоставить общий набор интерфейсов для фреймворков, чтобы последние могли использовать одинаковые абстракции. Это позволит разработчикам писать переиспользуемый, независимый от фреймворка код. Сам стандарт объемный, и не имеет смысла его дублировать. В этом уроке мы поговорим только о ключевых особенностях.</p>
3 <p>Request и Response с точки зрения стандарта - это абстракция поверх механизмов, встроенных в сам PHP. Например, они полностью заменяют собой суперглобальные массивы, механизм загрузки файлов и многое другое.</p>
3 <p>Request и Response с точки зрения стандарта - это абстракция поверх механизмов, встроенных в сам PHP. Например, они полностью заменяют собой суперглобальные массивы, механизм загрузки файлов и многое другое.</p>
4 <p>Объекты запроса и ответа во фреймворке Slim имеют интерфейс, соответствующий стандарту<a>PSR-7</a>. Пример на главной странице фреймворка демонстрирует это:</p>
4 <p>Объекты запроса и ответа во фреймворке Slim имеют интерфейс, соответствующий стандарту<a>PSR-7</a>. Пример на главной странице фреймворка демонстрирует это:</p>
5 <p>getBody() возвращает специальный объект-поток (stream). Этот объект можно изменять, записывая туда данные.</p>
5 <p>getBody() возвращает специальный объект-поток (stream). Этот объект можно изменять, записывая туда данные.</p>
6 <p>Интерфейсы, описанные в PSR7, эмулируют работу HTTP. С помощью их методов можно извлечь любую информацию из запроса и создать любой ответ.</p>
6 <p>Интерфейсы, описанные в PSR7, эмулируют работу HTTP. С помощью их методов можно извлечь любую информацию из запроса и создать любой ответ.</p>
7 <p>Эти методы работают не только для запроса, но и для ответа. Оба интерфейса<em>Request</em>и<em>Response</em>имеют общую часть, которая называется<em>Message</em>. Получается, что многие методы повторяются и одинаково работают в каждом из этих объектов.</p>
7 <p>Эти методы работают не только для запроса, но и для ответа. Оба интерфейса<em>Request</em>и<em>Response</em>имеют общую часть, которая называется<em>Message</em>. Получается, что многие методы повторяются и одинаково работают в каждом из этих объектов.</p>
8 <p>Названия заголовков в PSR-7 регистронезависимы. В самом PHP заголовки всегда переводятся в верхний регистр и хранятся в массиве $_SERVER с префиксом HTTP_:</p>
8 <p>Названия заголовков в PSR-7 регистронезависимы. В самом PHP заголовки всегда переводятся в верхний регистр и хранятся в массиве $_SERVER с префиксом HTTP_:</p>
9 <h2>Response</h2>
9 <h2>Response</h2>
10 <p>Ответ аккумулирует внутри себя то, что отправится клиенту, но он изначально не пустой, а содержит некоторые разумные умолчания:</p>
10 <p>Ответ аккумулирует внутри себя то, что отправится клиенту, но он изначально не пустой, а содержит некоторые разумные умолчания:</p>
11 <p>А вот с изменением все не так просто. Главная отличительная черта этого интерфейса в том, что он построен в иммутабельном (неизменяемом) стиле и реализует<a>текучий интерфейс (fluent interface)</a>. Ответ невозможно изменить. Вместо этого всегда возвращается новый объект:</p>
11 <p>А вот с изменением все не так просто. Главная отличительная черта этого интерфейса в том, что он построен в иммутабельном (неизменяемом) стиле и реализует<a>текучий интерфейс (fluent interface)</a>. Ответ невозможно изменить. Вместо этого всегда возвращается новый объект:</p>
12 <p>По этой причине во фреймворках, поддерживающих стандарт PSR-7, обработчик запроса всегда должен вернуть объект ответа. Только в этом случае фреймворк узнает о том, как надо ответить на запрос:</p>
12 <p>По этой причине во фреймворках, поддерживающих стандарт PSR-7, обработчик запроса всегда должен вернуть объект ответа. Только в этом случае фреймворк узнает о том, как надо ответить на запрос:</p>
13 <p>Единственная часть в<em>Response</em>, которую можно менять, - тело ответа. Это связано с техническими особенностями работы потоков в самом PHP. Подробнее об этом можно прочитать в<a>документации</a>.</p>
13 <p>Единственная часть в<em>Response</em>, которую можно менять, - тело ответа. Это связано с техническими особенностями работы потоков в самом PHP. Подробнее об этом можно прочитать в<a>документации</a>.</p>
14 <p>При этом PSR7 достаточно низкоуровневый стандарт. У него нет цели сделать работу с объектами ответа и запроса максимально удобной и простой. Задача была в эмуляции поведения HTTP. Поэтому помимо реализации стандартных интерфейсов многие фреймворки создают дополнительные обертки поверх PSR7.</p>
14 <p>При этом PSR7 достаточно низкоуровневый стандарт. У него нет цели сделать работу с объектами ответа и запроса максимально удобной и простой. Задача была в эмуляции поведения HTTP. Поэтому помимо реализации стандартных интерфейсов многие фреймворки создают дополнительные обертки поверх PSR7.</p>
15 <p>Эти обертки дают много прикладных полезных методов. Одну из таких оберток мы начали использовать с самого начала:<a>Slim-Http</a>. Вот лишь небольшой список полезных функций этой библиотеки, которые мы либо использовали, либо будем использовать:</p>
15 <p>Эти обертки дают много прикладных полезных методов. Одну из таких оберток мы начали использовать с самого начала:<a>Slim-Http</a>. Вот лишь небольшой список полезных функций этой библиотеки, которые мы либо использовали, либо будем использовать:</p>
16 <ul><li>Response::write($data) - изменяет ответ</li>
16 <ul><li>Response::write($data) - изменяет ответ</li>
17 <li>Response::withRedirect($url, $status)</li>
17 <li>Response::withRedirect($url, $status)</li>
18 <li>ServerRequest::getParam($key, $default)</li>
18 <li>ServerRequest::getParam($key, $default)</li>
19 <li>ServerRequest::getParsedBody()</li>
19 <li>ServerRequest::getParsedBody()</li>
20 </ul>
20 </ul>