Начнем

Учебное пособие

Концепции

Приложение

Запрос

Ответ

Routing

Обработка ошибок

Cook book

Дополнения

Contributing

Ответ - Response



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

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

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

<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

$app = new \Slim\App;
$app->get('/foo', function (ServerRequestInterface $request, ResponseInterface $response) {
    // Use the PSR 7 $response object

    return $response;
});
$app->run();
Figure 1: Ввести ответ PSR 7 в обратный вызов маршрута приложения.

Объект ответа PSR 7 вводится в ваше middleware Slim-приложения в качестве второго аргумента middleware, вызываемого следующим образом:

<?php
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;

$app = new \Slim\App;
$app->add(function (ServerRequestInterface $request, ResponseInterface $response, callable $next) {
    // Use the PSR 7 $response object

    return $next($request, $response);
});
// Define app routes...
$app->run();
Figure 2: Ввести ответ PSR 7 в прикладное промежуточное ПО.

Статус ответа

Каждый ответ HTTP имеет числовой status code. Код состояния определяет тип ответа HTTP, который должен быть возвращен клиенту. Код состояния объекта PSR 7 по умолчанию 200(OK). Вы можете получить код состояния объекта PSR 7 с помощью getStatusCode() метода, подобного этому.

$status = $response->getStatusCode();
Figure 3: Получить код состояния ответа.

Вы можете скопировать объект ответа PSR 7 и присвоить новый код состояния следующим образом:

$newResponse = $response->withStatus(302);
Figure 4: Создать ответ с новым кодом состояния.

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

У каждого HTTP-ответа есть заголовки. Это метаданные, которые описывают HTTP-ответ, но не отображаются в теле ответа. Объект Slim's PSR 7 Response предоставляет несколько методов для проверки и управления его заголовками.

Получить все заголовки

Вы можете получить все заголовки HTTP-ответа в качестве ассоциативного массива с помощью getHeaders() метода объекта PSR 7 Response . Результирующие ключи ассоциативного массива - это имена заголовков, и его значения сами представляют собой числовой массив строковых значений для их соответствующего заголовка.

$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
    echo $name . ": " . implode(", ", $values);
}
Figure 5: Извлечение и повторение всех заголовков HTTP-ответов в качестве ассоциативного массива.

Получить один заголовок

Вы можете получить значения (ов) одного заголовка с помощью getHeader($name) метода объекта PSR 7 Response. Это возвращает массив значений для данного заголовка. Помните, что один HTTP-заголовок может иметь более одного значения!

$headerValueArray = $response->getHeader('Vary');
Figure 6: Получить значения для определенного HTTP-заголовка.

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

$headerValueString = $response->getHeaderLine('Vary');
Figure 7:Получить значения одного заголовка в виде строки, разделенной запятыми.

Обнаружение заголовка

Вы можете проверить наличие заголовка с помощью hasHeader($name) метода объекта PSR 7 Response .

if ($response->hasHeader('Vary')) {
    // Do something
}
Figure 8: Обнаружение присутствия определенного HTTP-заголовка.

Установить заголовок

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

$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
Figure 9: Настройка заголовка HTTP
напоминание
Объект Response неизменен. Этот метод возвращает копию объекта Response с новым значением заголовка. Этот метод является разрушительным и заменяет существующие значения заголовков, уже связанные с тем же заголовком.

Добавить заголовок

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

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

Удалить заголовок

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

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

Тело ответа

Ответ HTTP обычно имеет тело. Slim предоставляет объект PSR 7 Response, с помощью которого вы можете проверять и обрабатывать тело ответа в конечном итоге.

Так же, как объект запроса PSR 7, объект ответа PSR 7 реализует тело как экземпляр \Psr\Http\Message\StreamInterface. Вы можете получить StreamInterface экземпляр тела ответа HTTP с помощью getBody() метода объекта PSR 7 Response. getBody() Способ является предпочтительным , если исходящей длина ответа HTTP , неизвестна или слишком большая для доступной памяти.

$body = $response->getBody();
Figure 12: Получить тело ответа HTTP

Получаемый \Psr\Http\Message\StreamInterface экземпляр предоставляет следующие методы для чтения, итерации и записи в базовый PHP resource.

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

Чаще всего вам нужно будет записать объект PSR 7 Response. Вы можете записать содержимое в StreamInterface экземпляр с помощью его write() метода следующим образом:

$body = $response->getBody();
$body->write('Hello');
Figure 13: Запись содержимого в тело ответа HTTP

Вы также можете заменить тело объекта PSR 7 Response совершенно новым StreamInterface экземпляром. Это особенно полезно, когда вы хотите передать контент из удаленного адресата (например, файловой системы или удаленного API) в ответ HTTP. Вы можете заменить тело объекта PSR 7 Response своим withBody(StreamInterface $body) методом. Его аргумент ДОЛЖЕН быть примером \Psr\Http\Message\StreamInterface.

$newStream = new \GuzzleHttp\Psr7\LazyOpenStream('/path/to/file', 'r');
$newResponse = $oldResponse->withBody($newStream);
Figure 14: Замените тело ответа HTTP
напоминание
Объект Response неизменен. Этот метод возвращает копию объекта Response, который содержит новый элемент.

Возвращение JSON

У объекта Slim Response есть собственный метод, withJson($data, $status, $encodingOptions) помогающий упростить процесс возвращения данных JSON.

Параметр $data содержит структуру данных, которые вы хотите возвратить как JSON. $status является необязательным и может использоваться для возврата пользовательского HTTP-кода. $encodingOptions является необязательным, и для него используются одни и те же параметры кодирования json_encode().

В простейшей форме данные JSON могут быть возвращены с кодом состояния HTTP по умолчанию 200.

$data = array('name' => 'Bob', 'age' => 40);
$newResponse = $oldResponse->withJson($data);
Figure 15: Возврат JSON с кодом состояния HTTP HTTP.

Мы также можем вернуть данные JSON с пользовательским кодом состояния HTTP.

$data = array('name' => 'Rob', 'age' => 40);
$newResponse = $oldResponse->withJson($data, 201);
Figure 16: Возврат JSON с кодом статуса HTTP HTTP.

Content-Type В ответ автоматически устанавливается application/json;charset=utf-8.

Если есть проблема с кодировкой данных в JSON, a \RuntimeException($message, $code) выбрано значение, содержащее значения json_last_error_msg() как $message и json_last_error() как $code.

напоминание
Объект Response неизменен. Этот метод возвращает копию объекта Response с новым заголовком Content-Type. Этот метод является разрушительным, и он заменяет существующий заголовок Content-Type. Статус также заменяется, если статус $ был передан при withJson() вызове.

Возврат перенаправления

Объект ответа Slim имеет настраиваемый метод, withRedirect($url, $status = null) когда вы хотите вернуть перенаправление на другой URL. Вы указываете, $url куда вы хотите, чтобы клиент был перенаправлен вместе с дополнительным $status кодом.

return $response->withRedirect('/new-url', 301);
Figure 17: Возврат перенаправления с необязательным кодом состояния.