问题描述
|
有人可以解释什么是编译器通过吗?
解决方法
CompilerPass
实现是某种侦听器,在从配置文件构建依赖项注入容器之后,将其保存为纯PHP之前在缓存中执行。它们用于构建一些结构,这些结构需要从外部资源访问定义,或者需要一些XML / YAML配置中不可用的编程。您可以将它们视为可以修改整个DIC的“最终过滤器”。
让我们考虑一个TwigBundle及其TwigEnvironmentPass。它的作用非常简单:
获取对“ 1”服务的引用(定义为“ 2”)
查找所有已标记“ 3”标记的服务。为此,您需要使用完整的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;
}