Я пытаюсь понять, как работает PSR-7, и я застреваю! Вот мой код:
$app->get('/', function () {
$stream = new Stream('php://memory', 'rw');
$stream->write('Foo');
$response = (new Response())
->withHeader('Content-Type', 'text/html')
->withBody($stream);
});
Мой объект Response создан, но теперь я хочу отправить его …
Как PSR-7 отправить ответ? Нужна ли сериализация? Я наверное пропустил одну вещь …
Psr-7 просто моделирует http сообщения. Он не имеет функций для отправки ответов. Вам нужно использовать другую библиотеку, которая использует сообщения PSR-7. Вы могли бы взглянуть на Zend Stratigility или что-то подобное
Просто как завершение, даже если вопросу более двух лет:
Ответ — это HTTP-сообщение, отправленное сервером клиенту в результате запроса от клиента к серверу.
Клиент ожидает строку как сообщение, состоящее из:
HTTP/<protocol-version> <status-code> <reason-phrase>
);<header-name>: <comma-separ.-header-values>
«);И это выглядит так (см. PSR-7):
HTTP/1.1 200 OK
Content-Type: text/html
vary: Accept-Encoding
This is the response body
Чтобы создать ответ, нужно выполнить три операции:
Сложная часть представлена третьей операцией. Экземпляр класса, реализующего ResponseInterface
содержит объект потока в качестве тела сообщения. И этот объект должен быть преобразован в строку и напечатан. Задача может быть легко выполнена, потому что поток является экземпляром класса, реализующего StreamInterface
, что, в свою очередь, обеспечивает определение магического метода __нанизывать().
Итак, выполнив первые два шага и применив функцию вывода (echo
, print_r
и т. д.) к результату getBody()
метод экземпляра ответа, процесс отправки завершен.
<?php
if (headers_sent()) {
throw new RuntimeException('Headers were already sent. The response could not be emitted!');
}
// Step 1: Send the "status line".
$statusLine = sprintf('HTTP/%s %s %s'
, $response->getProtocolVersion()
, $response->getStatusCode()
, $response->getReasonPhrase()
);
header($statusLine, TRUE); /* The header replaces a previous similar header. */
// Step 2: Send the response headers from the headers list.
foreach ($response->getHeaders() as $name => $values) {
$responseHeader = sprintf('%s: %s'
, $name
, $response->getHeaderLine($name)
);
header($responseHeader, FALSE); /* The header doesn't replace a previous similar header. */
}
// Step 3: Output the message body.
echo $response->getBody();
exit();
П.С .: Для больших объемов данных лучше использовать php://temp
поток вместо php://memory
, Вот это причина.