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 ответ
Вы должны изменить пару из этого:
- вам нужно унаследовать
ExceptionController
в вашем собственном контроллере исключений. вам нужно переопределить
twig.controller.exception.class
параметр. Как вы можете видеть в служебном файле, он используетtwig.controller.exception.class
параметр для определения класса контроллера исключений. Теперь переопределите это с вашим классом:parameters: twig.controller.exception.class: My\CustomBundle\CustomExceptionController
вам нужно отредактировать подпись
showAction
следовать новой подписипоскольку
ExceptionController
больше не расширяетсяContainerAware
как добраться до текущего контейнера? Достаточно ли реализоватьContainerAwareInterface
?
Нет, сервисы никогда не должны вводить контейнер. Вы должны добавить нужные вам сервисы в конструктор, как это делается с Twig_Environment
оказание услуг.
Внутри вашего контроллера Exception вы получаете доступ к $this->twig
собственность для службы ветки. И новая подпись получает $request
параметр, чтобы получить запрос. Я не думаю, что вам нужно больше. (вы также получаете $this->debug
)