2017-11-26 4 views
0

でサービスを生成します。dynamicaly私はこのような何かを設定するためにsymfonyのとYAMLを使用していsymfonyの

foo_menu: 
    groups: 
     main: 
      items: 
       # ... 
     side: 
      items: 
       # ... 
     footer: 
      items: 
       # ... 

私の考えはfoo_menu.groupsの下で定義された各ツリーは、自身のサービス定義を持つべきであるということでした。各サービスは、例としてMenuServiceであり、定義されたすべての項目がその中にあります。各サービスは、名前でアクセス可能でなければなりません。 foo.menu.mainfoo.menu.side、...

メニュービルディングは完全に機能しますが、サービス名の登録方法と場所はわかりません。

私は、コンパイラのパスを使用しようとしましたが、それは動作しません。

final class MenuCompilerPass implements CompilerPassInterface 
{ 
    public function process(ContainerBuilder $container) 
    { 
     // ... 

     foreach ($names as $name) { 
      $id = sprintf('foo.menu.group.%s', $name); 

      $menu = $factory->getMenu($name); 
      $container->set($id, $menu); 
     } 
    } 
} 
+1

あなたは完全なSymfonyフレームワークを使用していますか?そうであれば、サービス自体ではなく、サービス定義を作成するためにコンパイラが渡すことが望まれます。他のバンドルの例を見てみましょう。あなたが何か異なったことをしているのであれば、「うまくいかない」という考えが助けになるかもしれないという考えがあります。 – Cerad

+0

ありがとう、それは手がかりだった! –

答えて

0

は、それが働いて手に入れました。予想よりも簡単だった

foreach ($groups as $name => $items) { 
     $id = sprintf('foo.menu.group.%s', $name); 
     $definition = new Definition(MyBuilder::class, array($items)); 

     $container->setDefinition($id, $definition); 
    } 
関連する問題