Symfony 2.2扩展了ExceptionController

isy*_*ate 8 php exception-handling symfony symfony-2.2

此问题与以下更改有关(Symfony 2.2发行版的一部分):

第1部分

在2.2版之前的Symfony中,我重写ExceptionController了显示一些自定义错误页面.

我这样做是通过:

parameters:
       twig.exception_listener.controller: My\CustomBundle\CustomExceptionController::showAction
Run Code Online (Sandbox Code Playgroud)

现在,在升级到2.2之后,我再也不能这样做,因为在生成异常时抛出异常(没有双关语):

ExceptionController :: __ construct()必须是Twig_Environment的一个实例,没有给定,在...中调用

既然ExceptionController现在是服务,我该如何覆盖它,以及在旧代码中需要更改什么?

我在自定义类中所做的全部更改了showAction方法中的模板引用:

$template = new TemplateReference('TwigBundle', 'Exception', $name, $format, 'twig');
Run Code Online (Sandbox Code Playgroud)

第2部分

由于ExceptionController不再延伸ContainerAware,我如何到达当前容器?是否足以实施ContainerAwareInterface

Wou*_*r J 12

你应该改变这几个:

  1. 您需要继承ExceptionController自定义的异常控制器.
  2. 你需要覆盖twig.controller.exception.class参数.正如您在服务文件中看到,它使用twig.controller.exception.class参数来标识异常控制器类.现在用你的类覆盖它:

    parameters:
        twig.controller.exception.class: My\CustomBundle\CustomExceptionController
    
    Run Code Online (Sandbox Code Playgroud)
  3. 您需要编辑签名showAction以遵循新签名

    由于ExceptionController不再延伸ContainerAware,我如何到达当前容器?是否足以实施ContainerAwareInterface

不,服务不应该永远不会注入容器.您应该像在服务中那样在构造函数中注入所需的Twig_Environment服务.

在您的Exception控制器中,您可以访问$this->twigtwig服务的属性.并且新签名获取$request参数以获取请求.我认为你不需要更多.(你也得到$this->debug)