php - 为什么 PSR-7 响应的正文是可变的?
问题描述
既然 PSR-7 响应应该是不可变的,为什么我要编写这段令人不安的“变异”代码?
public function controller(Response $response): Response
{
$response->getBody()->write("Hey.");
return $response;
}
在我看来,虽然 Response 本身是不可变的,这意味着我们在调用时会得到一个新对象$response->withHeader(…)
,但我们仍然可以(并且通常会)改变它的 Body 对象(不是响应中最不重要的部分)。
这不矛盾吗?或者它是完全明智的?这对我来说似乎很奇怪。
解决方案
您的问题直接在PSR-7 的元数据中得到回答:
为什么流是可变的?
StreamInterface API 包括诸如 write() 之类的方法,这些方法可以更改消息内容——这直接与不可变消息相矛盾。出现的问题是由于该接口旨在包装 PHP 流或类似的事实。因此,写入操作将代理写入流。即使我们使 StreamInterface 不可变,一旦流被更新,任何包装该流的实例也将被更新——这使得不可变性无法强制执行。
我们的建议是实现对服务器端请求和客户端响应使用只读流。
推荐阅读
- python - 自动选择今天最后创建的文件并发送电子邮件
- amazon-web-services - 如何在启用默认 EBS 加密的情况下使用 Beanstalk?
- c# - 从 Web 项目中排除了一个联系我们的 aspx 页面,但仍收到电子邮件?
- redux - Create-React-App Jest 失败:测试套件必须包含至少一个测试 - 但确实如此
- reactjs - 如何在 React 中动态导入两个 CSS 框架?
- php - 内存限制耗尽flysystem/src/Util/MimeType.php,如何找到文件路径?
- javascript - $refs 会扰乱插值吗?
- python-3.x - Sanic 如何为测试应用加载配置?
- java - 类可以通过接口实现另一个类吗?
- uwp - UWP Win 10 XAML 超级/子脚本呈现问题