Версия Slim

Начнем

Концепции

Приложение

Запрос

Ответ

Маршрутизация

Предоставляемые Middleware

Рецепты

Вклад в Slim

Ответ

Маршруты и промежуточное ПО вашего приложения Slim получают объект ответа PSR-7, представляющий текущий HTTP-ответ, который должен быть возвращен клиенту. Объект ответа реализует PSR-7 ResponseInterface, с помощью которого вы можете проверять и управлять состоянием ответа HTTP, заголовками и телом.

Как получить объект Response

Объект ответа 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');
Напоминание
Объект Response является неизменным. Этот метод возвращает копию объекта Response с новым значением заголовка. Этот метод является деструктивным и заменяет существующие значения заголовка, уже связанные с тем же именем заголовка.

Добавление значения заголовка

Вы можете добавить значение заголовка объекту PSR-7 ответа с помощью метода withAddedHeader($name, $value).

$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
Напоминание
В отличие от метода withHeader(), этот метод добавляет новое значение к набору значений, которые уже существуют для того же имени заголовка. Объект Response является неизменным. Этот метод возвращает копию объекта Response с добавленным значением заголовка.

Удаление заголовка

Вы можете удалить заголовк из объекта PSR-7 ответа с помощью метода withoutHeader($name).

$newResponse = $oldResponse->withoutHeader('Allow');
Напоминание
Объект Response является неизменным. Этот метод возвращает копию объекта Response без удаленного заголовка.

Тело ответа

Обычно 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-ресурса:

  • getSize()
  • tell()
  • eof()
  • isSeekable()
  • seek()
  • rewind()
  • isWritable()
  • write($string)
  • isReadable()
  • read($length)
  • getContents()
  • getMetadata($key = null)

Чаще всего вам нужно писать в объект ответа 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);
Напоминание
Объект Response является неизменным. Этот метод возвращает копию объекта Response с новым телом.

Возврат JSON

В простейшей форме данные 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);
Напоминание
Объект Response является неизменным. Этот метод возвращает копию объекта Response с новым заголовком Content-Type. Этот метод является деструктивным и заменяет существующие значения заголовка Content-Type header.

Ответ с перенаправлением

Вы можете перенаправить клиента на другой ресурс, используя HTTP ответ с заголовком Location

return $response
  ->withHeader('Location', 'https://www.example.com')
  ->withStatus(302);