情景:
Symfony2项目与主数据库和远程数据的辅助(远程)一起使用。远程数据库可能已关闭,或者它们之间的连接可能被切断。在这种情况下,我仍然希望执行继续正常,尽管通知遥控器已关闭。
我到目前为止在我的事件监听器中试过这个:
public function onKernelException(GetResponseForExceptionEvent $event)
{
$exception = $event->getException();
if (
$exception instanceof ConnectionException ||
$exception instanceof PDOException ||
$exception instanceof \PDOException ||
$exception instanceof DBALException
) {
$this->flash->flashMessage('remote_server_connection_error', array(), FlashBagUtil::TYPE_ALERT);
// $kernel = $event->getKernel();
// $request = $event->getRequest();
// $response = $kernel->handle($request, HttpKernelInterface::MASTER_REQUEST, true);
// $response->setStatusCode(Response::HTTP_OK);
// $event->setResponse($response);
$event->stopPropagation();
echo 'works';
}
}
如果我取消注释响应部分,我会按预期重新调整页面,但状态为500,而不是200,因为我已明确设置。 “作品”得到回应,所以事件部分工作正常。
在Symfony2 kernel.exception监听器中处理异常并忽略其余请求的正确方法是什么?
非常感谢
答案 0 :(得分:2)
如 documentation 中所述,kernel.exception
事件:
由于Symfony根据异常确保将响应状态代码设置为最合适的状态代码,因此在响应上设置状态将不起作用。如果要覆盖状态代码(在没有充分理由的情况下不应该这样做),请设置X-Status-Code标头
所以你必须设置这个标题:
$response->headers->set('X-Status-Code', Response::HTTP_OK);