既然PSR-7响应应该是不可变的,为什么我可以写这个令人不安的“变异”代码呢?
public function controller(Response $response): Response
{
$response->getBody()->write("Hey.");
return $response;
}在我看来,虽然响应本身是不可变的,这意味着我们在调用$response->withHeader(…)时得到了一个新对象,但是我们仍然可以(而且通常会)改变它的Body对象(响应中最重要的部分)。
这不是不一致吗?还是完全明智?我觉得挺奇怪的。
发布于 2020-09-10 18:44:02
您的问题在PSR-7元中直接回答。
为什么流是可变的? StreamInterface API包含诸如write()之类的方法,这些方法可以更改消息内容--直接与具有不可变消息相矛盾。 出现问题的原因是,接口的目的是包装PHP流或类似的文件。因此,写操作将代理写入流。即使我们使StreamInterface不可变,一旦流被更新,任何封装该流的实例也将被更新--这使得不变性无法执行。 我们的建议是,实现对服务器端请求和客户端响应使用只读流。
https://stackoverflow.com/questions/63794247
复制相似问题