我在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的形式返回我的数据。以与RedirectResponse相同的方式。我尝试过:
$event->stopPropagation();
但是事实有点过头了。在这种情况下,似乎$ event-> setResponse中不是RedirectResponse的所有内容都标记为404。
有什么想法吗?
最后通过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
我通过以下代码解决了此问题。
use Symfony\Component\HttpKernel\Exception\HttpException;
...
$event->setException(new HttpException(200));
就我而言,在尝试了多种解决方案之后,我使用了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();
$response->getStatusCode() == Response::HTTP_NOT_FOUND ? $response->setStatusCode(Response::HTTP_OK) : $response->getStatusCode();
$event->setResponse($response);
}
}