Symfony2异常控制器在发生致命错误时呈现现有内容

时间:2015-12-07 10:33:12

标签: php symfony

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

...
{{ 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,但我看不出如何解决这个问题。

1 个答案:

答案 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”。但是,已渲染的内容已丢失。