繁体   English   中英

如果发生致命错误,Symfony2异常控制器将渲染到现有内容中

[英]Symfony2 exception controller renders into existing content in case of Fatal Errors

我在模板的代码中,在模板末尾附近抛出了一个异常:

...
{{ offer.throwError() }}
...

提供:: throwError:

 public function throwError() {
        $foo = $this->getAdvantageText()->getFoo(); //fatal error
        throw new \Exception("blah"); //only exception
    }

没有自定义任何内容,我希望将错误页面呈现为响应(使用Twig的默认ExceptionController,我们实际上要覆盖它)。 当Offer :: getAdvantageText()=== null时,将引发FatalErrorException并将错误页面的内容直接写入引发异常的位置的标记中。 当我刚抛出自定义异常时,它会按预期工作(显示单个错误页面)。 当我调试ExceptionController时,应该显式清除输出缓冲区:

Twig / ExceptionController:

 protected function getAndCleanOutputBuffering($startObLevel)
    {
        if (ob_get_level() <= $startObLevel) {
            return '';
        }

        Response::closeOutputBuffers($startObLevel + 1, true);

        return ob_get_clean();
    }

但是在我所有的致命错误情况下,ob_get_level是<= $ startObLevel(在我的情况下为“ 2”,由内核移交)。 我们还没有适当的应用程序/网关缓存。 在这种情况下,当我手动清除输出缓冲区时,页面被“清除”,并且按预期得到了一个错误页面响应。 据我所知,没有片段渲染(这会发出一个子请求)。

我曾考虑过利用kernel.exception事件并自行清除所有内容,但我认为只是自定义控制器还是可以解决问题的。 似乎“致命”错误正在干扰Symfony内核的过时堆栈,但我看不到如何解决该问题。

我已经有了解决该问题的初步解决方案。 在我的自定义异常控制器中,我还覆盖了getAndCleanOutputBuffering方法:

protected function getAndCleanOutputBuffering($startObLevel)
{
    Response::closeOutputBuffers($startObLevel + 1, false);
    return ob_get_clean();
} 

如果Response::closeOutputBuffers的第二个参数设置为false ,它将在内部调用“ ob_end_clean”而不是“ ob_end_flush”。 但是,已经渲染的内容将丢失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM