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