从扩展中的先前捆绑包访问服务定义

时间:2016-09-05 14:25:09

标签: php symfony

我有两个A和B捆绑在AppKernel.php中加载(第一个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');
}

所以我的问题是为什么我可以访问先前加载的包中的参数而不是服务定义?我知道有编译器传递,但我想在不先设置参数的情况下向定义添加一些方法调用。

1 个答案:

答案 0 :(得分:1)

无论在AppKernel.php中注册捆绑包的顺序如何,因为在load()方法中不会获得实际的容器实例,而是获取副本。此容器仅包含来自实际容器的参数(不是来自其他包/扩展的服务定义)。所以你应该看到这个异常消息:

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

加载后,副本将合并到实际容器中。 More details

但是,您可以在其他地方执行此操作,只需要实现PrependExtensionInterface

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

prepend()方法中,您可以在每个已注册的分发包扩展上调用ContainerBuilder方法之前完全访问load()实例。所以你可以在那里玩外部包定义。 More details