目前可以在prependExtension() 方法中访问其他捆绑配置,这是推荐的地方:
class MyMakerBundle extends AbstractBundle
{
public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
{
$configs = $builder->getExtensionConfig('maker');
// ...
}
}
但是,此方法旨在预先添加更多配置,而不是获取/处理这些配置。因此,您必须考虑到它是一个未处理和未合并的配置列表,如果另一个扩展在您自己的扩展之后将新配置添加到 MakerBundle,这些配置可能会发生变化。
此外,这个root_namespace 的值可以是(在这种情况下不太可能)参数或环境变量(没有意义,但仍然可能),此时尚未解决(原始值)。
选项 1(最安全)
在您的 MyMakerBundle::configure() 方法中创建一个类似的配置,并将从 MakerBundle 扩展中获得的配置添加到前面:
public function configure(DefinitionConfigurator $definition): void
{
$definition->rootNode()
->children()
->scalarNode('root_namespace')->end()
->end();
}
public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
{
$configs = $builder->getExtensionConfig('maker');
// iterate in reverse to preserve the original order after prepending the config
foreach (array_reverse($configs) as $config) {
$container->prependExtensionConfig('my_maker', [
'root_namespace' => $config['root_namespace'],
]);
}
}
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
// do something with
$config['root_namespace'];
}
https://symfony.com/doc/current/bundles/prepend_extension.html
选项 2(有风险)
因为是只在dev模式下使用的简单配置,所以可以直接做一个简单的$config = array_merge(...$configs)得到$config['root_namespace']的值:
public function prependExtension(ContainerConfigurator $container, ContainerBuilder $builder): void
{
$configs = $builder->getExtensionConfig('maker');
$config = array_merge(...$configs);
$container->parameters()
->set('my_maker.root_namespace', $config['root_namespace']);
}
public function loadExtension(array $config, ContainerConfigurator $container, ContainerBuilder $builder): void
{
// do something with
$builder->getParameter('my_maker.root_namespace'));
$builder->getParameterBag()->remove('my_maker.root_namespace');
}
第二个选项也可以在 CompilerPass 中完成,其好处是您不需要创建时间参数。
选项 3(有风险)
在 CompilerPass 类中,从属于 MakerBundle 的以下服务之一获取根命名空间值:
-
maker.generator 参数 1(例如 $container->getDefinition('maker.generator')->getArgument(1))
-
maker.autoloader_finder 参数 0。
我知道,到目前为止,它并不像您想象的那么简单和直观。