【问题标题】:Ignore and continue on specific Symfony2 kernel.exception event忽略并继续特定 Symfony2 kernel.exception 事件
【发布时间】:2014-10-27 15:35:54
【问题描述】:

场景:

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。 “works”得到回显,因此事件部分工作正常。

对于来自 Symfony2 kernel.exception 监听器的其余请求,处理异常并忽略它的正确方法是什么?

非常感谢

【问题讨论】:

    标签: php symfony


    【解决方案1】:

    正如 documentation 中所说,对于kernel.exception 事件:

    由于 Symfony 确保根据异常将响应状态代码设置为最合适的状态,因此设置响应的状态将不起作用。如果你想覆盖状态码(你不应该没有充分的理由),设置 X-Status-Code 标题

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

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

    【讨论】:

    • 谢谢你,这解决了我的状态码问题,但你会说我的整体方法是正确的吗?
    • 在您的情况下,如果无法连接到远程数据库不会干扰用户的应用程序使用,我会说这是最干净的方法,在这种情况下,200 状态代码确实可以.
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2019-04-10
    • 2011-12-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多