3

使用以下配置树:

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

似乎对于一个空数组,之前的规范化回调永远不会执行。

4

3 回答 3

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();
于 2013-04-26T13:48:32.310 回答
0

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

我认为,与其尝试在配置处理器的返回结果中删除此键,不如在处理完成后处理此配置项(始终为数组)更有意义。例如,如果它为空,您可以取消设置它。

$config = $processor->processConfiguration($configuration, array());
if(empty($config['parameters'])) {
    unset($config['parameters']);
}
于 2013-04-20T23:15:55.680 回答
0

Gremo,你几乎成功了。你试过了beforeNormalization,但是parameterskey 是标准化的结果,所以它在标准化之后出现。所以我们应该使用一些终结例程,例如:

$rootNode->validate()
    ->always(function($val) {
        if (empty($val['parameters'])) {
            unset($val['parameters']);
        }

        return $val;})
    ->end()
于 2013-04-25T08:34:53.460 回答