Издайте ответ с PSR-7

Я пытаюсь понять, как работает 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 отправить ответ? Нужна ли сериализация? Я наверное пропустил одну вещь …

2

Решение

Psr-7 просто моделирует http сообщения. Он не имеет функций для отправки ответов. Вам нужно использовать другую библиотеку, которая использует сообщения PSR-7. Вы могли бы взглянуть на Zend Stratigility или что-то подобное

3

Другие решения

Просто как завершение, даже если вопросу более двух лет:

Ответ — это 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

Чтобы создать ответ, нужно выполнить три операции:

  1. послать «статусная строка» для клиента (используя Заголовок () Функция PHP).
  2. послать список заголовков для клиента (Дито).
  3. Выход тело сообщения.

Сложная часть представлена ​​третьей операцией. Экземпляр класса, реализующего 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, Вот это причина.

0

По вопросам рекламы [email protected]