Symfony2对CompilerPass的解释?

时间:2011-06-24 22:57:54

标签: php symfony php-5.3

有人可以解释一下编译器是什么吗?

1 个答案:

答案 0 :(得分:25)

CompilerPass实现是在从配置文件构建依赖注入容器之后以及在缓存中将其保存为普通PHP之前执行的某种侦听器。它们用于构建一些需要从外部资源访问定义的结构,或者需要一些XML / YAML配置中不可用的编程。您可以将它们视为可以修改整个DIC的“最终过滤器”。

让我们考虑一个TwigBundle及其TwigEnvironmentPass。它的作用很简单:

  1. 获取对twig服务(定义为<service id="twig" class="..." ...>
  2. 的引用
  3. 查找已使用twig.extension标记标记的所有服务。为此,您可以使用完整的DIC(从XML配置文件构建),因为这些服务可能在任何捆绑包中定义。
  4. 为服务创建方法构建自定义代码。
  5. 作为最终结果,将生成以下代码:

    protected function getTwigService()
    {
        $this->services['twig'] = $instance = new \Twig_Environment($this->get('twig.loader'), ...);
    
        // THIS HAS BEEN ADDED THANKS TO THE TwigEnvironmentPass:
        $instance->addExtension(new \Symfony\Bundle\SecurityBundle\Twig\Extension\SecurityExtension($this->get('security.context')));
        $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\TransExtension($this->get('translator')));
        $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\TemplatingExtension($this));
        $instance->addExtension(new \Symfony\Bundle\TwigBundle\Extension\FormExtension(array(0 => 'TwigBundle::form.html.twig', 1 => 'SiteBundle::widgets.html.twig')));
        $instance->addExtension(new \MyProject\SiteBundle\Twig\Extension\MyVeryOwnExtensionToTwig($this));
    
        return $instance;
    }