使用以下配置树:
$rootNode
->fixXmlConfig('parameter')
->children()
->arrayNode('parameters')
->useAttributeAsKey('name')
->prototype('array')
->children()
->scalarNode('type')->end()
->scalarNode('value')->end()
->end()
->end()
->end()
->end();
...即使我没有指定parameters
键,Symfony也会添加一个空数组:
$config = $processor->processConfiguration($configuration, array());
var_dump($config); // Output is array('parameters' => array())
但如果没有参数,我希望parameters
键未设置,缺席。
我已尝试删除beforeNormalization
中的密钥(如果为空),但它不起作用:
$rootNode
->beforeNormalization()
->always(function ($v) {
if(empty($v['parameters'])) {
unset($v['parameters']);
}
return $v;
})
似乎使用空数组,从未执行规范化回调。
答案 0 :(得分:0)
Array节点将确保配置键的规范化值始终为数组而不是其他任何内容,即使没有提供任何内容(在这种情况下,您将得到一个空数组)。
我认为,在处理完成后处理这个配置项(总是数组)会更有意义,而不是试图摆脱配置处理器的返回结果中的这个键。例如,如果它为空,则可以取消设置。
$config = $processor->processConfiguration($configuration, array());
if(empty($config['parameters'])) {
unset($config['parameters']);
}
答案 1 :(得分:0)
beforeNormalization
,但parameters
键是规范化的结果,因此它在正常化后发生。所以我们应该使用一些终结例程,例如:
$rootNode->validate()
->always(function($val) {
if (empty($val['parameters'])) {
unset($val['parameters']);
}
return $val;})
->end()
答案 2 :(得分:0)
在我看来,你应该使用treeBuilder NodeDefinition API来说如果没有设置它应该为null:
$rootNode
->fixXmlConfig('parameter')
->children()
->arrayNode('parameters')
->useAttributeAsKey('name')
->prototype('array')
->children()
->scalarNode('type')->end()
->scalarNode('value')->end()
->end()
->end()
->defaultNull() /////// defaults to null OR
->setAddIfNotSet(false)
->end()
->end();