Symfony 7 返回重复响应

问题描述 投票:0回答:1

我需要一些帮助来解决 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响应返回内容两次但我相信我的情况有所不同,因为它在不同的环境下有不同的响应

php symfony
1个回答
0
投票

我终于明白发生了什么事。

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 我就不会遇到这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.