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

时间:2013-08-22 17:45:01

标签: symfony exception-handling response

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

对于某些404,我会进行重定向,效果很好。对于浏览器,不会抛出404。

new RedirectResponse( $newURL );

该行基本上用200替换404状态代码。

在其他情况下,我想要返回一些内容,而不是404消息,而是一些替换数据。像这样:

$response = new Response( $returnJSONMessage );
$response->headers->set( 'Content-Type', 'application/json' );
$response->setStatusCode(200);

代码明智,这很好,但它不会阻止返回404。我猜是因为它在这个范围内:

$event->setResponse( $theResponse );

类型为GetResponseForExceptionEvent。

我需要调用什么来让它以200而不是404的形式返回我的数据。就像RedirectResponse看起来一样。 我试过了:

$event->stopPropagation();

但事后有点过了。似乎$ event-> setResponse中的任何内容都不是RedirectResponse,在这种情况下标记为404。

有什么想法吗?

4 个答案:

答案 0 :(得分:13)

终于通过Symfony GitHub拉取了我想要的东西;

$response->headers->set( 'X-Status-Code', 200 );

允许您覆盖异常状态代码。

$response->setStatusCode(200);

不行。

请求: https://github.com/symfony/symfony/pull/5043

拉到这里: https://github.com/symfony/symfony/commit/118a5d2274dc7d6701c3e2a758b820cd49ebaf3b

答案 1 :(得分:2)

我在代码后解决了这个问题。

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

答案 2 :(得分:0)

在我的情况下,尝试了多种解决方案后,我使用了Event Subscriber from Symfony并声明了“内核响应”事件:

  /**
   * {@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);
    }
  }

答案 3 :(得分:0)

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

然后我发现了为什么-从Symfony 3.3起不推荐使用X-Status-Code。

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

$exception = $event->getException();
$response = new Response('...', 404);

// ...

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

这是Symfony website

上的相关链接
相关问题