我研究了使用PSR7创建自己的微框架的机会(不要问我为什么!)。所以我创建了简单的httpfoundation和模板组件。现在我正在测试我的这部分工作并遇到下一个问题。 我创建了Response对象:
public function __construct($statusCode = 200, $headers = null, $body = null)
{
$this->statusCode = $statusCode ? $statusCode : $this->checkedStatusCode($statusCode);
$this->headers = $headers ? $headers : new Headers();
$this->body = $body ? $body : new Stream(fopen('php://temp', 'w+'));
}
视图已成功生成。然后我尝试在我的Response对象中编写它。 我的模板类中的代码
public function render(ResponseInterface $response, $template, array $data)
{
$output = $this->retrieve($template, $data);
$response->getBody()->write($output);
return $response;
}
...和Stream类
public function write($string)
{
if (!$this->isWritable()) {
throw new \RuntimeException('Could not write to stream');
}
$result = fwrite($this->stream, $string);
if ($result === false) {
throw new \RuntimeException('Could not write to stream');
}
return $result;
}
我认为结果是成功的,因为$ result包含写入的字节数! 之后,我尝试使用Response class
中的方法dispatch()从Response对象中检索内容public function dispatch()
{
return $this->getBody()->getContents();
}
...和来自Stream类的方法getContents()
public function getContents()
{
if (!$this->stream) {
throw new \RuntimeException("Stream is not readable");
}
$result = stream_get_contents($this->stream);
if ($result === false) {
throw new \RuntimeException("Error reading of stream");
}
return $result;
}
我得到空字符串! 请帮我理解我丢失书面的身体!为什么我得到空弦! 谢谢你!
答案 0 :(得分:0)
当写入 Stream 成功但 stream_get_contents($this->stream);
给你一个空字符串时,那么指针很可能没有设置到流的开头。可以通过多种方式将指针设置为开头。
可能性 1
// supply a maxlength, and offset
$contents = stream_get_contents($this->stream, -1, 0);
可能性 2
rewind($this->stream);
$contents = stream_get_contents($this->stream);
可能性 #3
fseek($this->stream, 0);
$contents = stream_get_contents($this->stream);