我需要一些帮助来解决 Symfony 7.1 上的一个我无法弄清楚的奇怪问题。 我在本地设置了一个 Symfony 项目,并在 MacOS 主机上使用 Symfony 内置服务器运行,效果非常好
{
"my_response" : [
{
"attribute" : "value1"
},
{
"attribute" : "value2"
}
]
}
但是,Windows 主机上的完全相同的项目(首先)并最终在线部署到 Linux 服务器上,输出以下结果
{
"my_response" : [
{
"attribute" : "value1"
},
{
"attribute" : "value2"
}
]
}
{
"my_response" : [
{
"attribute" : "value1"
},
{
"attribute" : "value2"
}
]
}
我的控制器/动作看起来像这样
#[Route('/pathto/apiresponse', name: 'path_to_api')]
public function apiresponse(ApiResponse $apiResponse): Response
{
$response = new Response();
$response->setContent(json_encode($apiResponse->retrieveResponse()));
$response->setStatusCode(Response::HTTP_OK);
$response->headers->set('Content-Type', 'application/json');
return $response->send();
}
我已经看到这个Symfony json响应返回内容两次但我相信我的情况有所不同,因为它在不同的环境下有不同的响应
我终于明白发生了什么事。
Symfony 的 Response send() 方法如下(参考:https://github.com/symfony/symfony/blob/7.2/src/Symfony/Component/HttpFoundation/Response.php)
/**
* Sends HTTP headers and content.
*
* @param bool $flush Whether output buffers should be flushed
*
* @return $this
*/
public function send(bool $flush = true): static
{
$this->sendHeaders();
$this->sendContent();
if (!$flush) {
return $this;
}
if (\function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
} elseif (\function_exists('litespeed_finish_request')) {
litespeed_finish_request();
} elseif (!\in_array(\PHP_SAPI, ['cli', 'phpdbg', 'embed'], true)) {
static::closeOutputBuffers(0, true);
flush();
}
return $this;
}
我的堆栈启用了
fastcgi_finish_request
,因此具有“正确”的响应输出,而在未启用的其他环境中,出现了重复输出的事件。
如果我一开始就使用 JsonResponse 我就不会遇到这个问题。