[英]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.