Symfony2对CompilerPass的解释?

fly*_*der 11 php symfony php-5.3

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

Cro*_*zin 25

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

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

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

作为最终结果,将生成以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)