Может кто-нибудь объяснить, что такое compilerpass?
Symfony2 объяснение 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;
}