Вашим маршрутам Slone и промежуточному программному обеспечению предоставляется объект ответа PSR 7, который представляет текущий HTTP-ответ, который должен быть возвращен клиенту. Объект ответа реализует PSR 7 ResponseInterface, с помощью которого вы можете проверять и обрабатывать статус ответа HTTP, заголовки и тело.
Объект ответа 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();
Объект ответа 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();
Каждый ответ HTTP имеет числовой status code. Код состояния определяет тип ответа HTTP,
который должен быть возвращен клиенту. Код состояния объекта PSR 7 по умолчанию 200(OK)
.
Вы можете получить код состояния объекта PSR 7 с помощью getStatusCode()
метода, подобного этому.
$status = $response->getStatusCode();
Вы можете скопировать объект ответа PSR 7 и присвоить новый код состояния следующим образом:
$newResponse = $response->withStatus(302);
У каждого HTTP-ответа есть заголовки. Это метаданные, которые описывают HTTP-ответ, но не отображаются в теле ответа. Объект Slim's PSR 7 Response предоставляет несколько методов для проверки и управления его заголовками.
Вы можете получить все заголовки HTTP-ответа в качестве ассоциативного массива с помощью getHeaders()
метода объекта
PSR 7 Response . Результирующие ключи ассоциативного массива - это имена заголовков, и его значения
сами представляют собой числовой массив строковых значений для их соответствующего заголовка.
$headers = $response->getHeaders();
foreach ($headers as $name => $values) {
echo $name . ": " . implode(", ", $values);
}
Вы можете получить значения (ов) одного заголовка с помощью getHeader($name)
метода объекта PSR 7 Response.
Это возвращает массив значений для данного заголовка. Помните, что один HTTP-заголовок может иметь более одного
значения!
$headerValueArray = $response->getHeader('Vary');
Вы также можете получить строку с разделителями-запятыми со всеми значениями для данного заголовка
с помощью getHeaderLine($name)
метода объекта PSR 7 Response . В отличие от getHeader($name)
метода,
этот метод возвращает строку, разделенную запятыми.
$headerValueString = $response->getHeaderLine('Vary');
Вы можете проверить наличие заголовка с помощью hasHeader($name)
метода объекта PSR 7 Response .
if ($response->hasHeader('Vary')) {
// Do something
}
Вы можете установить значение заголовка с помощью withHeader($name, $value)
метода объекта PSR 7 Response.
$newResponse = $oldResponse->withHeader('Content-type', 'application/json');
Вы можете добавить значение заголовка с помощью withAddedHeader($name, $value)
метода объекта PSR 7 Response
$newResponse = $oldResponse->withAddedHeader('Allow', 'PUT');
withHeader()
метода, этот метод добавляет новое значение к набору
значений, которые уже существуют для одного и того же заголовка. Объект Response
неизменен. Этот метод возвращает копию объекта Response с добавленным значением заголовка.
Вы можете удалить заголовок с помощью withoutHeader($name)
метода объекта Response.
$newResponse = $oldResponse->withoutHeader('Allow');
Ответ HTTP обычно имеет тело. Slim предоставляет объект PSR 7 Response, с помощью которого вы можете проверять и обрабатывать тело ответа в конечном итоге.
Так же, как объект запроса PSR 7, объект ответа PSR 7 реализует тело как экземпляр
\Psr\Http\Message\StreamInterface
. Вы можете получить StreamInterface
экземпляр
тела ответа HTTP с помощью getBody()
метода объекта PSR 7 Response. getBody()
Способ является предпочтительным , если исходящей длина ответа HTTP , неизвестна
или слишком большая для доступной памяти.
$body = $response->getBody();
Получаемый \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');
Вы также можете заменить тело объекта 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);
У объекта 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);
Мы также можем вернуть данные JSON с пользовательским кодом состояния HTTP.
$data = array('name' => 'Rob', 'age' => 40);
$newResponse = $oldResponse->withJson($data, 201);
Content-Type
В ответ автоматически устанавливается application/json;charset=utf-8
.
Если есть проблема с кодировкой данных в JSON, a \RuntimeException($message, $code)
выбрано значение,
содержащее значения json_last_error_msg()
как $message
и json_last_error()
как $code
.
withJson()
вызове.
Объект ответа Slim имеет настраиваемый метод, withRedirect($url, $status = null)
когда вы хотите вернуть перенаправление на другой URL. Вы указываете, $url
куда
вы хотите, чтобы клиент был перенаправлен вместе с дополнительным $status
кодом.
return $response->withRedirect('/new-url', 301);