使用symfony动态生成服务

时间:2017-11-26 11:05:10

标签: symfony dependency-injection generator

我使用symfony和yaml配置如下内容:

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 个答案:

答案 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);
    }