2011-06-24 3 views

答えて

25

CompilerPass実装は、依存関係注入コンテナが設定ファイルから構築された後でプレーンなPHPとしてキャッシュに保存される前に実行される何らかのリスナーです。外部リソースからの定義へのアクセスが必要な構造や、XML/YAML構成では利用できないプログラミングが必要な構造を構築するために使用されます。 DIC全体を変更できる「最終フィルタ」とみなすことができます。

TwigBundleとそのTwigEnvironmentPassを考えてみましょう。何それがないことは非常に簡単です:

  1. twig.extensionタグでタグ付けされたすべてのサービスを探す(<service id="twig" class="..." ...>として定義)twigサービス
  2. への参照を取得します。これを行うには、(XML構成ファイルから構築された)完全なDICを、どのバンドルでも定義できるため、作業してください。
  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