Symfony2 объяснение CompilerPass? - PullRequest
11 голосов
/ 25 июня 2011

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

1 Ответ

25 голосов
/ 25 июня 2011
Реализации

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...