Php 从扩展中的上一个捆绑包访问服务定义

Php 从扩展中的上一个捆绑包访问服务定义,php,symfony,Php,Symfony,我在AppKernel.php中加载了两个包A和B(首先是A,然后是B) 配置1(工作) 捆绑包A,扩展: public function load(array $configs, ContainerBuilder $container) { $container->setParameter('test', '123'); } public function load(array $configs, ContainerBuilder $container) { $test

我在AppKernel.php中加载了两个包A和B(首先是A,然后是B)

配置1(工作)

捆绑包A,扩展:

public function load(array $configs, ContainerBuilder $container)
{
    $container->setParameter('test', '123');
}
public function load(array $configs, ContainerBuilder $container)
{
    $test = $container->getParameter('test');
}
public function load(array $configs, ContainerBuilder $container)
{
    $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
}
public function load(array $configs, ContainerBuilder $container)
{
    $def = $container->findDefinition('test_service');
}
B包,扩展:

public function load(array $configs, ContainerBuilder $container)
{
    $container->setParameter('test', '123');
}
public function load(array $configs, ContainerBuilder $container)
{
    $test = $container->getParameter('test');
}
public function load(array $configs, ContainerBuilder $container)
{
    $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
}
public function load(array $configs, ContainerBuilder $container)
{
    $def = $container->findDefinition('test_service');
}
配置2(不工作)

捆绑包A,扩展:

public function load(array $configs, ContainerBuilder $container)
{
    $container->setParameter('test', '123');
}
public function load(array $configs, ContainerBuilder $container)
{
    $test = $container->getParameter('test');
}
public function load(array $configs, ContainerBuilder $container)
{
    $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
    $loader->load('services.yml');
}
public function load(array $configs, ContainerBuilder $container)
{
    $def = $container->findDefinition('test_service');
}
B包,扩展:

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

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

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

You have requested a non-existent service "test_service".
加载后,副本将合并到实际容器中


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

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

prepend()
方法中,在对每个已注册的捆绑扩展调用
load()
方法之前,您可以完全访问
ContainerBuilder
实例。因此,您可以在那里使用外部捆绑包定义

我不确定是否理解这个问题,但也许文档可以帮助您,谢谢。我更新了我的问题,让它更清楚。这似乎有效。我创建了一个单独的services_prepend.yml,加载到prepend函数中。然后我可以访问服务定义。