2011-06-24 42 views

回答

25

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; 
} 
+0

很好的解釋,謝謝! – acme