阻止Symfony 2配置处理器添加空数组?

时间:2013-04-18 10:42:00

标签: symfony symfony-2.1

使用以下配置树:

$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;
        })

似乎使用空数组,从未执行规范化回调。

3 个答案:

答案 0 :(得分:0)

Array节点将确保配置键的规范化值始终为数组而不是其他任何内容,即使没有提供任何内容(在这种情况下,您将得到一个空数组)。

我认为,在处理完成后处理这个配置项(总是数组)会更有意义,而不是试图摆脱配置处理器的返回结果中的这个键。例如,如果它为空,则可以取消设置。

$config = $processor->processConfiguration($configuration, array());
if(empty($config['parameters'])) {
    unset($config['parameters']);
}

答案 1 :(得分:0)

Gremo,你几乎成功了。您尝试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();