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

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

Ответ 1

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

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

  • Получить ссылку на службу twig (определенную как <service id="twig" class="..." ...>)
  • Найти все службы, помеченные тегом twig.extension. Для этого вы работаете над полным DIC (созданным из файлов конфигурации XML), поскольку эти службы могут быть определены в любом комплекте.
  • Создайте собственный код для создания службы.

В качестве конечного результата будет создан следующий код:

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;
}