Большинство ответов в моем приложении представляют собой либо представления, либо 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
. Независимо от того, как я это делаю, проблема заключается в том, как поместить строку в поток.