2013-02-04 20 views
2

在我正在工作的其中一個項目中,需要爲每個包實現自定義404頁面。如何在symfony 2.x中實現每個包404頁面

documentation裏面有這樣的功能隻字不提。

我討論這個問題和一些同事,被告知,它使用kernel.exception事件,唉這一個缺乏這束被調用它的信息。

恕我直言,這應該通過應用補丁symfony的路由器組件,這將允許開發人員指定捕獲所有可能進一步處理的情況下的路線是固定的。

另一種辦法是改變RouterInterface ::匹配方法的行爲返回包含該匹配的路徑和其匹配它束一致的輸出。目前這是不可能的,因爲如果匹配失敗並且根本沒有給你任何信息,它會拋出一個異常,儘管它可以。

例如,我有其定義來處理以「/ API」網址的ApiBundle。目前處理這一個並設置自定義404頁面的唯一方法是在kernel.exception和preg_match()url時獲取請求。然而,這是硬編碼,應該避免,因爲該軟件包不應該具有這樣的知識 - 它是在app/config/routing文件中定義的。

您的意見是?
我會很感激任何其他解決方法。

+3

如何在'app/Resources/TwigBundle/views/Exception'中用空白的小枝文件覆蓋模板,然後在小包中進行擴展? – cheesemacfly

+0

有什麼意義?應用程序/資源文件旨在覆蓋捆綁應用後的所有內容。即使我從我的包中擴展文件,它也不會被加載。 –

+1

你的目標是爲每個包實現一個自定義404頁面嗎?如果您在文件「app/Resources/TwigBundle/views/Exception/error404.html.twig」中放置了一個類似於「{%block content%} {%endblock%}」的塊,然後在每個包中創建了一個擴展文件從它和寫在這個塊。我沒有測試過,但這樣做對我來說很有意義。 – cheesemacfly

回答

0

我已經結束了執行我的自定義ExceptionController它發送一個事件我叫「ourCompany.exception_response」。

  • 默認數據包的偵聽器設置優先級爲-1024。
  • 如果自定義捆綁包處理異常並設置其響應,則必須標記該事件並停止傳播。
  • 自定義包可以使用服務容器來獲取任何想要的信息,以確定是處理異常還是不處理。