我在我的模板代码中抛出异常,在模板末尾附近:
...
{{ 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时,它应该显式清除输出缓冲区:
嫩枝/ ExceptionController:
protected function getAndCleanOutputBuffering($startObLevel)
{
if (ob_get_level() <= $startObLevel) {
return '';
}
Response::closeOutputBuffers($startObLevel + 1, true);
return ob_get_clean();
}
但在我所有的致命错误案例中,ob_get_level是&lt; = $ startObLevel(由内核移交,在我的情况下是“2”)。我们还没有应用程序/网关缓存(还)。当我在那种情况下手动清除输出缓冲区时,页面被“清除”,我按预期得到一个错误页面响应。据我所知,没有任何片段呈现(这会发出一个子请求)。
我考虑过利用kernel.exception事件并自行清除所有内容,但我认为只需自定义控制器即可。似乎“致命”错误正在干扰Symfony内核的ob-stack,但我看不出如何解决这个问题。
答案 0 :(得分:0)
我已经有了解决该问题的初步解决方案。在我的自定义异常控制器中,我还覆盖了getAndCleanOutputBuffering方法:
protected function getAndCleanOutputBuffering($startObLevel)
{
Response::closeOutputBuffers($startObLevel + 1, false);
return ob_get_clean();
}
如果Response::closeOutputBuffers
'第二个参数设置为false
,它将在引擎盖下调用“ob_end_clean”而不是“ob_end_flush”。但是,已渲染的内容已丢失。