2014-12-03 3 views
1

Я сдаюсь.Страница ошибки Symfony 2 и Twig

Проблема с переопределенным шаблоном Twig 404. Он переопределяется по умолчанию, создавая файл error404.html.twig в каталоге/app/Resources/TwigBundle/views.

Сам шаблон не содержит нерегулярной или сложной логики: просто макет с некоторым переведенным текстом (| trans) и меню с несколькими ссылками.

Проблема заключается в том, что я не могу получить объект app.user (возвращаемый как NULL) или текущий файл app.request.locale (всегда возвращаемый по умолчанию) внутри этого шаблона.

Я даже попытался переопределить контроллер исключения ветви и сбросить текущую локаль (Request :: getLocale()) или получить пользователя - результаты одинаковые - стандартная локаль и NULL для пользователя.

Затем я решил углубиться и нашел десятков слушателей (слушателей локалей, литтеров исключений ...) и попытался отлаживать/исправлять/тестировать там, но я больше не продвигался дальше.

Кстати, я тоже переопределил страницу с ошибкой 500, и там все в порядке. Ну, я думаю, что когда вызывается 500 ошибок (исключение), symfony уже настроил user/locale/etc, потому что он уже попал в цель (контроллер/действие), а другие слушатели уже выполнены. Но ошибка 404 (NotFoundHttpException) бросается до того, как Symfony нацеливается на действие ...

Несколько слов о проекте: symfony 2.4.8, доктрина, расширения Gedmo/stof bundle, JMS i18n routing bundle.

Symfony версия: v2.4.8 JMS I18n Routing расслоение: 1.1.1

Цените вашу помощь.

+0

Проблема решена (хорошо, насколько это возможно). Решение предлагается дьявольским. – Dmitry

ответ

2

Вот так я это сделать (по крайней мере 404 шаблонов):

В приложение/Config/routing.yml Append:

#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)); 

    } 
} 

И в вашем твиттере приложение/Ресурсы/TwigBundle/views/Exception/error404.html.twig вы можете получить доступ {{ user }}

+0

Спасибо за идею! Думаю, я выберу этот ответ как принятый :) – Dmitry

+0

Кстати, вы можете просто выбросить NotFoundHttpException() здесь без визуализации шаблона. – Dmitry

+0

Да, я знаю. Но как бы вы передали «пользователь» в шаблон? – devilcius

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

Смежные вопросы