首页 > 解决方案 > 为什么 PSR-7 响应的正文是可变的?

问题描述

既然 PSR-7 响应应该是不可变的,为什么我要编写这段令人不安的“变异”代码?

public function controller(Response $response): Response
{
    $response->getBody()->write("Hey.");

    return $response;
}

在我看来,虽然 Response 本身是不可变的,这意味着我们在调用时会得到一个新对象$response->withHeader(…),但我们仍然可以(并且通常会)改变它的 Body 对象(不是响应中最不重要的部分)。

这不矛盾吗?或者它是完全明智的?这对我来说似乎很奇怪。

标签: phppsr-7

解决方案


您的问题直接在PSR-7 的元数据中得到回答:

为什么流是可变的?
StreamInterface API 包括诸如 write() 之类的方法,这些方法可以更改消息内容——这直接与不可变消息相矛盾。

出现的问题是由于该接口旨在包装 PHP 流或类似的事实。因此,写入操作将代理写入流。即使我们使 StreamInterface 不可变,一旦流被更新,任何包装该流的实例也将被更新——这使得不可变性无法强制执行。

我们的建议是实现对服务器端请求和客户端响应使用只读流。


推荐阅读