8

这个问题与以下更改有关(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不再 extends ContainerAware,我如何到达当前容器?实施就够了ContainerAwareInterface吗?

4

1 回答 1

12

你应该改变几个:

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

    parameters:
        twig.controller.exception.class: My\CustomBundle\CustomExceptionController
    
  3. 您需要编辑签名showAction以遵循新签名

    由于ExceptionController不再 extends ContainerAware,我如何到达当前容器?实施就够了ContainerAwareInterface吗?

不,服务不应该永远注入容器。您应该在构造函数中注入您需要的服务,就像对Twig_Environment服务所做的那样。

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

于 2013-04-02T20:40:03.217 回答