Symfony 2.2 расширяет ExceptionController

Этот вопрос связан со следующим изменением (часть выпуска Symfony 2.2):

Часть 1

В предыдущей версии 2.2 Symfony меня переопределял ExceptionController для отображения некоторых пользовательских страниц ошибок.

Я сделал это через:

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

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

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

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

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

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

Часть 2

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

1 ответ

Решение

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

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

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

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

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

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

Другие вопросы по тегам