Symfony Config组件根配置节点文档是否存在误导,是我遗漏了什么吗?
问题根源
当你在TreeBuilder构造函数中指定根节点名称为foo时,processConfiguration方法会默认将传入的配置数组直接作为foo根节点的子配置进行校验,不需要在配置数组外层额外套一层foo键。你当前的写法相当于给foo根节点传入了['foo' => ['bar' => 'a']]的内容,自然会触发foo根节点下未定义foo子项的报错。
Symfony框架加载Bundle配置时会自动剥离配置文件外层的Bundle别名根键,再传入处理器处理,因此文档描述的逻辑和框架内的表现一致,单独使用Config组件时没有这层自动处理逻辑,需要自行调整传参结构。
修复方案
方案1:调整传入的配置数组(推荐)
去掉配置数组外层的foo键,直接传入根节点下的子配置即可:
$config = new Config(); $processor = new \Symfony\Component\Config\Definition\Processor(); $a = ['bar' => 'a']; $b = ['bar' => 'b']; $c = $processor->processConfiguration($config, [$a, $b]);
处理后得到的$c结果为['bar' => 'b'],符合预期。
方案2:调整配置树结构,适配原有配置数组
如果配置数组是从文件加载的原始内容,需要保留外层foo键,可以修改配置树定义:
class Config implements \Symfony\Component\Config\Definition\ConfigurationInterface { public function getConfigTreeBuilder() { $builder = new \Symfony\Component\Config\Definition\Builder\TreeBuilder('root'); $builder->getRootNode() ->children() ->arrayNode('foo') ->children() ->scalarNode('bar')->end() ->end() ->end() ->end(); return $builder; } }
原有调用逻辑不需要修改,即可正常校验通过。
内容的提问来源于stack exchange,提问作者Andrew Dinmore
相关产品推荐
相关产品推荐

