Реализации
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;
}