Symfony2 объяснение CompilerPass?

может кто-нибудь объяснить, что такое compilerpass?

1 ответов


CompilerPass реализации - это своего рода прослушиватели, которые выполняются после того, как контейнер инъекции зависимостей построен из файлов конфигурации и до того, как он будет сохранен как обычный PHP в кэше. Они используются для построения некоторых структур, требующих доступа к определениям из внешних ресурсов или программирования, недоступного в конфигурации XML/YAML. Вы можете рассматривать их как "окончательные фильтры", которые могут изменять весь DIC.

давайте рассмотрим TwigBundle и его TwigEnvironmentPass. То, что он делает, довольно просто:

  1. получить ссылку на twig услуги (определяется как <service id="twig" class="..." ...>)
  2. найти все службы, которые были помечены twig.extension тег. Для этого у вас есть работа над полным 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;
}