5

我在 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

4 回答 4

15

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

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

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

$response->setStatusCode(200);

不管用。

在这里请求: https ://github.com/symfony/symfony/pull/5043

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

于 2013-08-22T21:05:15.947 回答
2

我按照代码解决了这个问题。

use Symfony\Component\HttpKernel\Exception\HttpException;
...
$event->setException(new HttpException(200));
于 2014-10-23T02:12:16.100 回答
1

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

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

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

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

// ...

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

这是Symfony 网站上关于此的链接

于 2020-05-11T16:07:32.577 回答
0

就我而言,在尝试了多种解决方案后,我使用了Symfony 的 Event Subscriber并声明了事件 Kernel Response :

  /**
   * {@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);
    }
  }
于 2020-01-16T13:35:28.503 回答