簡體   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