2014-12-03 75 views
1

我放棄了。Symfony 2和Twig自定義錯誤頁面

問題在於被覆蓋的Twig 404模板。它通過在/ app/Resources/TwigBundle/views目錄下創建error404.html.twig以默認方式被覆蓋。

模板本身不包含任何不規則或複雜的邏輯:只是帶有一些翻譯文本(| trans)和帶有多個鏈接的菜單的佈局。

問題是,我無法在此模板中獲取app.user對象(返回爲NULL)或當前的app.request.locale(始終作爲默認語言環境返回)。

我甚至試圖覆蓋樹枝異常控制器並轉儲當前語言環境(Request :: getLocale())或獲取用戶 - 結果是相同的 - 默認的語言環境和用戶的NULL。

然後我決定深入挖掘,發現了幾十個聽衆(語言環境聽衆,例外情況,...),並試圖在那裏調試/修復/測試,但我沒有進一步處理。

順便說一句,我已經覆蓋了500錯誤頁面,並且一切都很好。那麼我猜,當引發500錯誤(異常)時,symfony已經設置了用戶/ locale/etc,因爲它已經到達目標(控制器/動作),並且其他監聽器已經執行。但是404錯誤(NotFoundHttpException)被拋出之前Symfony的目標是動作...

關於項目的一些話:symfony 2.4.8,doctrine,Gedmo擴展/ stof bundle,JMS i18n routing bundle。

Symfony的版本:v2.4.8 JMS的I18n路由包:1.1.1

感謝你的幫助。

+0

問題已解決(儘可能)。解決方案由devilcius提出。 – Dmitry 2014-12-04 11:14:33

回答

2

這是我做(至少404個模板)的方式:

應用程序/配置/ routing.yml中追加:

#always in last position 
#------------> 
nonexistent_route: 
    path:  /{url} 
    defaults: { _controller: ACMEDemoBundle:Default:wrongRoute} 
    requirements: 
     url: ".+"  
#<----------- 

控制器:

namespace ACME\DemoBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; 

class DefaultController extends Controller 
{ 
    ... 

    public function wrongRouteAction($url) 
    { 
     $user = $this->get('security.context')->getToken()->getUser(); 

     return $this->render('TwigBundle:Exception:error404.html.twig', array("user" => $user, "url" => $url)); 

    } 
} 

而在你的樹枝模板app/Resources/TwigBundle/views/Exception/error404.html.twig中,你可以訪問{{ user }}

+0

感謝您的想法!我想我會選擇這個答案作爲接受的:) – Dmitry 2014-12-04 11:13:43

+0

順便說一句,你可以在這裏拋出一個NotFoundHttpException()而不用渲染模板。 – Dmitry 2014-12-04 11:28:40

+0

是的,我知道。但是,如何將'user'傳遞給模板? – devilcius 2014-12-04 11:52:22

1

您可以在KernelException事件上創建註冊監聽器,並在那裏定義您需要的任何邏輯。像這樣:

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; 

class YourKernelExceptionListener 
{ 
    public function onKernelExcpetion(GetResponseForExceptionEvent $event) 
    { 
     // if the exception is instance of Symfony NotFoundHttpException 
     // you can do whatever you need and render whatever you need 
    } 
} 
+0

正確。但我希望這個解決方案將成爲我選擇的最後一個。不管怎麼說,還是要謝謝你。 – Dmitry 2014-12-04 11:13:17