2016-09-05 8 views
3

私はAppKernel.php(最初のA、次にB)にロードされる2つのバンドルAとBを持っています。拡張内の前のバンドルからのアクセスサービス定義

構成1(作品)

バンドルA、エクステンション:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $container->setParameter('test', '123'); 
} 

バンドルB、エクステンション:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $test = $container->getParameter('test'); 
} 

構成2(不動作)

バンドルA、拡張子:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 
    $loader->load('services.yml'); 
} 

バンドルB、拡張子:

public function load(array $configs, ContainerBuilder $container) 
{ 
    $def = $container->findDefinition('test_service'); 
} 

私はサービス定義を以前ロードされたバンドルからパラメータにアクセスすることはできませんが、なぜ私の質問はありますか?私はコンパイラのパスがあることを知っていますが、まずパラメータを設定せずに定義にメソッド呼び出しを追加したいのです。

+0

私はこの問題を理解できていませんが、ドキュメンテーションがあなたに役立つかもしれません。http://symfony.com/doc/current/bundles/prepend_extension.html – yceruto

+0

ありがとうございます。私は質問を明確にするように更新しました。 – Manu

答えて

1

どんなにバンドルがあるため、実際のコンテナインスタンスを取得しませんload()方法では、AppKernel.phpに登録された順番が、コピー。このコンテナには、実際のコンテナのパラメータのみが含まれます(他のバンドル/拡張のサービス定義ではありません)。したがって、この例外メッセージのように見えるはずです。

You have requested a non-existent service "test_service". 

ロード後、コピーは実際のコンテナにマージされます。 More detailsprepend()メソッド内

class BExtension extends Extension implements PrependExtensionInterface 
{ 
    public function prepend(ContainerBuilder $container) 
    { 
     $def = $container->findDefinition('test_service'); 
    } 
} 

、あなたがload()メソッドが呼び出される直前ContainerBuilderインスタンスへのフルアクセス権を持っている:


しかし、あなたが他の場所でそれを行うことができ、唯一のPrependExtensionInterface実装する必要があります登録されたバンドル拡張のそれぞれにだから、外部のバンドル定義を使って遊ぶことができます。 More details

+0

これはうまくいくようです。私はprepend関数でロードされた別個のservices_prepend.ymlを作成しました。それから私はサービス定義にアクセスできます。 – Manu

関連する問題