Symfony 2.2 расширить ExceptionController

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

Часть 1

в pre-2.2 Symfony я переопределял ExceptionController отображать пользовательские страницы ошибок.

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

parameters:
       twig.exception_listener.controller: MyCustomBundleCustomExceptionController::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. вам нужно отредактировать подпись the showAction следуя новая подпись

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

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

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