Php 从扩展中的上一个捆绑包访问服务定义
我在AppKernel.php中加载了两个包A和B(首先是A,然后是B) 配置1(工作) 捆绑包A,扩展: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
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函数中。然后我可以访问服务定义。