既然PSR-7响应应该是不可变的,我为什么要写这个令人不安的"突变";一段代码?
public function controller(Response $response): Response
{
$response->getBody()->write("Hey.");
return $response;
}
在我看来,虽然响应本身是不可变的,这意味着我们在调用$response->withHeader(…)
时会得到一个新对象,但我们仍然可以(通常也会(更改其Body对象(不是响应中最不重要的部分(。
这不是前后矛盾吗?还是完全合理?我觉得这很奇怪。
您的问题在PSR-7:的元中直接得到回答
为什么流是可变的
StreamInterface API包括write((等方法,这些方法可以更改消息内容,这与不可变消息直接矛盾。出现的问题是由于接口旨在包装PHP流或类似内容。因此,写入操作将代理写入流。即使我们使StreamInterface不可变,一旦流被更新,任何封装该流的实例也将被更新——这使得不可变性无法强制执行。
我们建议实现对服务器端请求和客户端响应使用只读流。