忽略并继续处理特定的Symfony2 kernel.exception事件

时间:2014-10-27 15:35:54

标签: php symfony

情景:

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监听器中处理异常并忽略其余请求的正确方法是什么?

非常感谢

1 个答案:

答案 0 :(得分:2)

documentation 中所述,kernel.exception事件:

  

由于Symfony根据异常确保将响应状态代码设置为最合适的状态代码,因此在响应上设置状态将不起作用。如果要覆盖状态代码(在没有充分理由的情况下不应该这样做),请设置X-Status-Code标头

所以你必须设置这个标题:

$response->headers->set('X-Status-Code', Response::HTTP_OK);