Как использовать ответы PSR-7?

Большинство ответов в моем приложении — это представления или JSON. Я не могу понять, как поместить их в объекты, которые реализуют ResponseInterface в PSR-7.

Вот что я сейчас делаю:

// Views
header('Content-Type: text/html; charset=utf-8');
header('Content-Language: en-CA');
echo $twig->render('foo.html.twig', array(
'param' => 'value'
/* ... */
));

// JSON
header('Content-Type: application/json; charset=utf-8');
echo json_encode($foo);

Вот что я пытаюсь сделать с PSR-7:

// Views
$response = new Http\Response(200, array(
'Content-Type' => 'text/html; charset=utf-8',
'Content-Language' => 'en-CA'
));

// what to do here to put the Twig output in the response??

foreach ($response->getHeaders() as $k => $values) {
foreach ($values as $v) {
header(sprintf('%s: %s', $k, $v), false);
}
}
echo (string) $response->getBody();

И я предполагаю, что это будет похоже на ответ JSON только с разными заголовками. Как я понимаю, тело сообщения является StreamInterface и это работает, когда я пытаюсь вывести файловый ресурс, созданный с fopen но как мне сделать это со строками?

Обновить

Http\Response в моем коде на самом деле моя собственная реализация ResponseInterface в PSR-7. Я реализовал все интерфейсы, так как в настоящее время я застрял с PHP 5.3, и я не смог найти какие-либо реализации, которые были бы совместимы с PHP < 5.4. Вот конструктор Http\Response:

public function __construct($code = 200, array $headers = array()) {
if (!in_array($code, static::$validCodes, true)) {
throw new \InvalidArgumentException('Invalid HTTP status code');
}

parent::__construct($headers);
$this->code = $code;
}

Я могу изменить мою реализацию, чтобы принять вывод в качестве аргумента конструктора, или я могу использовать withBody метод MessageInterface реализация. Независимо от того, как я это делаю, проблема в том, как получить строку в поток.

3

Решение

ResponseInterface продолжается MessageInterface, который обеспечивает getBody() геттер вы нашли. ПСР-7 ожидает реализации объекта ResponseInterface быть неизменным, чего вы не сможете достичь без изменения вашего конструктора.

Как вы работаете с PHP < 5.4 (и не может эффективно вводить подсказки), измените его следующим образом:

public function __construct($code = 200, array $headers = array(), $content='') {
if (!in_array($code, static::$validCodes, true)) {
throw new \InvalidArgumentException('Invalid HTTP status code');
}

parent::__construct($headers);
$this->code = $code;
$this->content = (string) $content;
}

Определить частного члена $content следующее:

private $content = '';

И получатель:

public function getBody() {
return $this->content;
}

И ты в порядке!

2

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

Других решений пока нет …

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