Документация/Контейнер/Сервисы/Response

Объект Response

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

Способы присвоения данных для Response в контроллерах:

// variant 1
use Hleb\Reference\ResponseInterface;
$this->container->get(ResponseInterface::class)->set('Hello, world!');

// variant 2
$this->container->response()->set('Hello, world!');

// variant 3
$this->response()->set('Hello, world!');

Способ аналогичен для всех классов, унаследованных от Hleb\Base\Container, но формирование ответа напрямую в Response вне контроллера будет плохой практикой.

Пример использования Response в коде приложения (код также будет трудно поддерживать в этом случае):

// variant 1
use Hleb\Static\Container;
use 
Hleb\Reference\ResponseInterface;
Container::get(ResponseInterface::class)->set('Hello, world!');

// variant 2
use Hleb\Static\Response;
Response::set('Hello, world!');

Также доступ к сервису Response может быть получен через внедрение зависимостей по интерфейсу Hleb\Reference\Interface\Response.

Для упрощения примеров, далее они будут содержать только обращение через DI.

В сочетании с выводом print и echo, данные из Response будут выведены позже, правильной стратегией будет использование только одного способа для вывода результатов.

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


#Тело ответа

Тело ответа - это добавленные в объект Response данные, которые можно преобразовать в строку. Обычно это текст сообщения, отображаемый пользователю или данные в формате JSON или XML, возможно генерируемый на лету HTML и т.д.

Для добавления данных предназначены следующие методы сервиса Response:
set() или setBody() — присвоение данных, полностью перезаписывающих предыдущее тело ответа при его наличии.
add() или addToBody() — добавление в конец к предыдущим добавленным данным.

Для получения данных из сервиса:
get() или getBody() — получение текущего состояния тела запроса в объекте Response.

Перед отправкой данных клиенту необходимо убедиться, что они проверены на XSS-уязвимости. Если данные не обрабатывались таким образом ранее, то их можно пропустить через PHP-функцию htmlspecialchars().


#HTTP-статус ответа

По умолчанию статус установлен как 200.
Если ответ должен иметь иной статус, то можно воспользоваться методом setStatus(), первым аргументом которого сам статус, а вторым короткое сообщение статуса, если оно отличается от стандартного. В статусе '404 Not Found' таким сообщением будет 'Not Found'.

Обычно используются стандартные сообщения статусов, так что установить статус по номеру можно сразу в методе set() вторым аргументом.

Получить текущий HTTP-статус из сервиса Response позволяет метод getStatus().


#Заголовки ответа

Кроме заголовков ответа, заданных глобально на стороне сервера, вы можете задать собственные, возвращаемые с конкретным ответом из фреймворка. Для заголовков второго типа и предназначены следующие методы сервиса Response.

<?php

namespace App\Controllers;

use 
Hleb\Base\Controller;
use 
Hleb\Reference\Interface\Request;
use 
Hleb\Reference\Interface\Response;

class 
ExampleController extends Controller
{
    public function 
index(Request $requestResponse $response): Response
    
{
        
$response->setHeader('Content-Type''application/json');

        
$headerData $response->getHeader('Content-Type');

        
var_dump($headerData); // array(1) { [0]=> string(16) "application/json" }

        
$response->setHeader('Content-Type''text/html; charset=utf-8');

        
$headerData $response->getHeader('Content-Type');

        
var_dump($headerData); // array(1) { [0]=> string(24) "text/html; charset=utf-8" }

        
return $response;
    }
}

Метод setHeader() устанавливает заголовок по названию, переопределяя предыдущее значение, если оно было установлено. В редком случае, когда необходимо создать несколько одинаковых заголовков, аргумент replace метода позволяет добавлять заголовок к текущему значению.

Метод hasHeader() проверяет наличие заголовка по названию.

Для получения массива данных заголовка по названию предназначен метод getHeader().

Данные всех установленных в Response заголовков возвращает метод getHeaders() в виде массива.

Операции над заголовками с помощью стандартных PHP-функций, хоть и будут работать вместе, но возможны конфликты с совместным использованием через объект Response. Лучше использовать только один подход во всём приложении.


#Версия HTTP-протокола

Версия HTTP-протокола по умолчанию равна '1.1', если не определено из текущего запроса. Так как в большинстве случаев вернуться должно значение как в самом запросе, то изменение используется редко.

Тем не менее, методы getVersion() и setVersion() предназначены для соответствующего получения и присвоения значения.

Request Кеширование

Страница создана: @fomiash
К началу страницы