Маршруты и промежуточное ПО вашего приложения Slim получают объект ответа PSR-7, представляющий текущий HTTP-ответ, который должен быть возвращен клиенту. Объект ответа реализует PSR-7 ResponseInterface, с помощью которого вы можете проверять и управлять состоянием ответа HTTP, заголовками и телом.
Объект ответа PSR-7 внедряется в маршруты вашего приложения Slim в качестве второго аргумента для обратного вызова маршрута, например:
<?php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Factory\AppFactory;
require __DIR__ . '/../vendor/autoload.php';
$app = AppFactory::create();
$app->get('/hello', function (ServerRequest $request, Response $response) {
$response->getBody()->write('Hello World');
return $response;
});
$app->run();Каждый HTTP-ответ имеет числовой код состояния. Код состояния идентифицирует тип ответа HTTP, который будет возвращен клиенту. По умолчанию, код состояния объекта ответа PSR-7 - 200 (ОК). Вы можете получить код состояния объекта PSR-7 Response с помощью метода getStatusCode() следующим образом.
$status = $response->getStatusCode();Вы можете скопировать объект ответа PSR-7 и назначить новый код состояния, например:
$newResponse = $response->withStatus(302);Каждый HTTP-ответ имеет заголовки. Это метаданные, которые описывают HTTP-ответ, но не видны в теле ответа. Объект Response PSR-7 предоставляет несколько методов для проверки и манипулирования своими заголовками.
Вы можете извлечь все заголовки HTTP-ответа в виде ассоциативного массива с помощью метода getHeaders() объекта PSR-7 ответа.
Ключи этого массива будут названиями заголовков, а их значения - нумерованными массивами строк, содержащими значения заголовка.
$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}Вы можете получить значения одного заголовка с помощью метода getHeader($name) объекта ответа PSR-7.
Метод возвращает массив значений для данного имени заголовка.
Помните, что один заголовок HTTP может иметь более одного значения!
$headerValueArray = $response->getHeader('Vary');Вы также можете получить разделенную запятыми строку со всеми значениями для данного заголовка с помощью метода getHeaderLine($name) объекта ответа PSR-7. В отличие от метода getHeader($name), этот метод возвращает строку объединенных через запятую значений.
$headerValueString = $response->getHeaderLine('Vary');Вы можете проверить наличие заголовка с помощью метода hasHeader($name) объекта ответа PSR-7.
if ($response->hasHeader('Vary')) {
// Do something
}Вы можете задать значение заголовка объекту ответа с помощью метода withHeader($name, $value).
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');Вы можете добавить значение заголовка объекту PSR-7 ответа с помощью метода withAddedHeader($name, $value).
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');withHeader(), этот метод добавляет новое значение к набору значений, которые уже существуют для того же имени заголовка. Объект Response является неизменным. Этот метод возвращает копию объекта Response с добавленным значением заголовка.Вы можете удалить заголовк из объекта PSR-7 ответа с помощью метода withoutHeader($name).
$newResponse = $oldResponse->withoutHeader('Allow');Обычно HTTP-ответ имеет тело.
Как и объект запроса PSR-7, объект ответа PSR-7 реализует тело как экземпляр Psr\Http\Message\StreamInterface.
Вы можете получить экземпляр тела ответа HTTP StreamInterface с помощью метода getBody() объекта PSR-7 Response.
Метод getBody() предпочтителен, если длина исходящего HTTP-ответа неизвестна или слишком велика для доступной памяти.
$body = $response->getBody();Результирующий экземпляр Psr\Http\Message\StreamInterface предоставляет следующие методы для чтения и итерации своего базового PHP-ресурса:
Чаще всего вам нужно писать в объект ответа PSR-7. Вы можете записать содержимое в экземпляр StreamInterface с помощью его метода write() следующим образом:
$body = $response->getBody();
$body->write('Hello');Вы также можете заменить тело объекта PSR-7 Response совершенно новым экземпляром StreamInterface.
Это особенно полезно, когда вы хотите передать содержимое из удаленного места назначения
(например, файловой системы или удаленного API) в ответ HTTP.
Вы можете заменить тело объекта PSR-7 Response его методом withBody(StreamInterface $body).
Его аргумент ДОЛЖЕН быть экземпляром Psr\Http\Message\StreamInterface.
use GuzzleHttp\Psr7\LazyOpenStream;
$newStream = new LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);В простейшей форме данные JSON могут быть возвращены с кодом состояния HTTP по умолчанию 200.
$data = array('name' => 'Bob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json');Так же мы можем возвращать JSON-данные с другими кодами состояния.
$data = array('name' => 'Rob', 'age' => 40);
$payload = json_encode($data);
$response->getBody()->write($payload);
return $response
->withHeader('Content-Type', 'application/json')
->withStatus(201);Вы можете перенаправить клиента на другой ресурс, используя HTTP ответ с заголовком Location
return $response
->withHeader('Location', 'https://www.example.com')
->withStatus(302);