2013-04-02 4 views
8

Этот вопрос связан с following change (часть Symfony 2.2 выпуска):Symfony 2,2 простираться ExceptionController

Часть 1

В пре-2,2 Symfony, я переопределение ExceptionController для отображения некоторых страниц ошибок ,

я не что с помощью:

parameters: 
     twig.exception_listener.controller: My\CustomBundle\CustomExceptionController::showAction 

Теперь, после обновления до версии 2.2, я больше не могу сделать это, так как исключение при генерации исключения (не каламбур):

ExceptionController :: __ конструкт() должен быть экземпляром Twig_Environment, ни данной, называемой в ...

Поскольку ExceptionController услуга теперь, как я могу переопределить это, и что мне нужно изменить в моем старом коде?

Все, что я сделал в пользовательском классе, изменяется ссылку шаблона в методе showAction:

$template = new TemplateReference('TwigBundle', 'Exception', $name, $format, 'twig'); 

Часть 2

Поскольку ExceptionController больше не распространяется ContainerAware, как добраться до тока контейнер? Достаточно ли реализовать ContainerAwareInterface?

ответ

12

Вы должны изменить пару этого:

  1. вам нужно наследовать ExceptionController в контроллере пользовательских исключений.
  2. необходимо, чтобы переопределить параметр twig.controller.exception.class. Как вы можете видеть в the service file, он использует параметр twig.controller.exception.class для идентификации класса контроллера исключения. Теперь переопределить его класс:

    parameters: 
        twig.controller.exception.class: My\CustomBundle\CustomExceptionController 
    
  3. вам нужно отредактировать подпись showAction чтобы следовать new signature

    Поскольку ExceptionController больше не распространяется ContainerAware, как добраться до текущего контейнера? Достаточно ли реализовать ContainerAwareInterface? не никогда

Нет, услуги должны вводить контейнер. Вы должны ввести нужные вам услуги в конструктор, как это делается с помощью службы Twig_Environment.

Внутри контроллера Exception вы получаете доступ к объекту $this->twig для службы веточек. И новая подпись получает параметр $request, чтобы получить запрос. Я не думаю, что вам нужно больше.(вы также получаете $this->debug)

+0

Thanks Wouter! То, что мне не хватало, это переопределение twig.controller.exception.class. Сейчас работает как шарм. – isyndicate

+1

На самом деле для второй части моего вопроса, в предыдущей реализации ExceptionController, мне удалось получить параметр из $ this-> container-> getParameter(). Как я могу получить тот же самый параметр в новом настраиваемом контроллере исключений, теперь, когда это сервис? Использует ли $ this-> twig-> getGlobals() правильный путь? – isyndicate

+1

Я тоже нашел этот урок: https://knpuniversity.com/screencast/symfony2-ep3/error-pages – shakaran

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