11
有人可以解釋什麼是編譯通道?Symfony2對CompilerPass的解釋?
有人可以解釋什麼是編譯通道?Symfony2對CompilerPass的解釋?
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;
}
很好的解釋,謝謝! – acme
我沒有看到一個什麼CompilerPass確實太本地化問題。 –