Symfony2异常响应。将404状态代码替换为200

Symfony2异常响应。将404状态代码替换为200,symfony,exception-handling,response,Symfony,Exception Handling,Response,我在symfony2中有一个404处理程序,它是一个EventListener 对于某些404,我执行重定向,这非常有效。对于浏览器,不会抛出404 new RedirectResponse( $newURL ); 这行代码基本上将404状态代码替换为200 但在其他情况下,我希望返回一些内容,而不是404消息,而是一些替换数据。大概是这样的: $response = new Response( $returnJSONMessage ); $response->headers->s

我在symfony2中有一个404处理程序,它是一个EventListener

对于某些404,我执行重定向,这非常有效。对于浏览器,不会抛出404

new RedirectResponse( $newURL );
这行代码基本上将404状态代码替换为200

但在其他情况下,我希望返回一些内容,而不是404消息,而是一些替换数据。大概是这样的:

$response = new Response( $returnJSONMessage );
$response->headers->set( 'Content-Type', 'application/json' );
$response->setStatusCode(200);
代码方面,这很好,但它不会阻止404被返回。我猜是因为它位于以下位置:

$event->setResponse( $theResponse );
属于GetResponseForExceptionEvent类型的

我需要调用什么,才能让它以200而不是404的形式返回我的数据。就像重定向响应看起来一样。 我试过:

但这有点过时了。在本例中,$event->setResponse中不是重定向响应的任何内容都会被标记为404


有什么想法吗?

终于通过Symfony GitHub pull找到了我想要的东西

$response->headers->set( 'X-Status-Code', 200 );
允许您覆盖异常状态代码

$response->setStatusCode(200);
这是行不通的

在此请求:

拉这里:

我通过以下代码解决了此问题

use Symfony\Component\HttpKernel\Exception\HttpException;
...
$event->setException(new HttpException(200));

在我的例子中,在尝试了多个解决方案之后,我使用并声明了事件内核响应:

  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() {
    $events[KernelEvents::RESPONSE][] = ['onKernelResponse', 0];
    return $events;
  }
然后,在函数onKernelResponse中,我将代码设置为返回200,而不是在特定情况下返回404:

  /**
   * @param FilterResponseEvent $event
   */
  public function onKernelResponse(FilterResponseEvent $event) {
    // Custom code to check which URL needs to return 200.
    $check_url_200 = $this->myOwnService->checkURL();
    if ($check_url_200) {
      $response = $event->getResponse();
      $status_code = $response->getStatusCode() == Response::HTTP_NOT_FOUND ? Response::HTTP_OK : $response->getStatusCode();
      $response->setStatusCode($status_code);
      $event->setResponse($response);
    }
  }

这里提供的建议对我不起作用

然后我发现了为什么自从Symfony 3.3以来-X-Status-Code被弃用

对我有用的是使用$event->allowCustomResponseCode()

这里是一个关于这个的链接

  /**
   * @param FilterResponseEvent $event
   */
  public function onKernelResponse(FilterResponseEvent $event) {
    // Custom code to check which URL needs to return 200.
    $check_url_200 = $this->myOwnService->checkURL();
    if ($check_url_200) {
      $response = $event->getResponse();
      $status_code = $response->getStatusCode() == Response::HTTP_NOT_FOUND ? Response::HTTP_OK : $response->getStatusCode();
      $response->setStatusCode($status_code);
      $event->setResponse($response);
    }
  }
$exception = $event->getException();
$response = new Response('...', 404);

// ...

$event->allowCustomResponseCode();
$event->setResponse($response);