Symfony配置树生成器

Symfony配置树生成器,symfony,Symfony,我希望创建如下配置: root_node: static_key: dynamic_key_1: [array, of, values] dynamic_key_2: [array, of, values] 我似乎无法理解正确的Treebuilder语法 我试过: $rootNode ->children() ->arrayNode('static_key') ->prototype('s

我希望创建如下配置:

root_node:
    static_key:
        dynamic_key_1: [array, of, values]
        dynamic_key_2: [array, of, values]
我似乎无法理解正确的Treebuilder语法

我试过:

$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('scalar')
            ->end()
        ->end()
    ->end()
;
但我得到:

路径“根节点.静态密钥.动态密钥\u 1”的类型无效。应为标量,但得到数组

当我切换到:

$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('array')
            ->end()
        ->end()
    ->end()
;
我得到:

“根节点.静态\u键.动态\u键\u 1”下无法识别的选项“0,1,2”

我最终发现我可以通过以下方式获得配置许可:

$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('variable')
            ->end()
        ->end()
    ->end()
;
但这并不能保证我得到一个数组

有人能给我指出正确的方向吗


我知道我可以做这样的事情:

/// treebuilder
$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('array')
                ->children()
                    ->scalarNode('attr_1')->end()
                    ->scalarNode('attr_2')->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

# config.yml
root_node:
    static_key:
        # two different syntaxes for emphasis
        dynamic_key_1:
            attr_1: value_1
            attr_2: value_2
        dynamic_key_2: {attr_1: value_3, attr_2: value_4}
root_node:
    static_key:
        - { key: dynamic_key_1, value: [array, of, values] }
        - { key: dynamic_key_2, value: [array, of, values] }
    $rootNode
        ->children()
            ->arrayNode('static_key')
                ->prototype('array')
                    ->children()
                        ->scalarNode('key')->isRequired()->end()
                        ->arrayNode('value')
                            ->prototype('scalar')
                            ->end()
                       ->end()
                    ->end()
                ->end()
            ->end()
        ->end()
并接收以下PHP数组:

array('root_node' => array(
    'static_key' => array(
        'dynamic_key_1' => array(
            'attr_1' => 'value_1', 
            'attr_2' => 'value_2'
        ),
        'dynamic_key_2' => array(
            'attr_1' => 'value_3', 
            'attr_2' => 'value_4'
        ),
    ),
));
我以前做过

我刚刚知道为什么不能严格要求非关联数组:


{attr\u 1:value\u 3,attr\u 2:value\u 4}
[value\u 3,value\u 4]
有什么不同?对我来说,两者都是数组:一个是关联的,另一个不是。不支持动态键

你应该这样做:

/// treebuilder
$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('array')
                ->children()
                    ->scalarNode('attr_1')->end()
                    ->scalarNode('attr_2')->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

# config.yml
root_node:
    static_key:
        # two different syntaxes for emphasis
        dynamic_key_1:
            attr_1: value_1
            attr_2: value_2
        dynamic_key_2: {attr_1: value_3, attr_2: value_4}
root_node:
    static_key:
        - { key: dynamic_key_1, value: [array, of, values] }
        - { key: dynamic_key_2, value: [array, of, values] }
    $rootNode
        ->children()
            ->arrayNode('static_key')
                ->prototype('array')
                    ->children()
                        ->scalarNode('key')->isRequired()->end()
                        ->arrayNode('value')
                            ->prototype('scalar')
                            ->end()
                       ->end()
                    ->end()
                ->end()
            ->end()
        ->end()
如果我是对的,你可能会得到这样的结果:

/// treebuilder
$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('array')
                ->children()
                    ->scalarNode('attr_1')->end()
                    ->scalarNode('attr_2')->end()
                ->end()
            ->end()
        ->end()
    ->end()
;

# config.yml
root_node:
    static_key:
        # two different syntaxes for emphasis
        dynamic_key_1:
            attr_1: value_1
            attr_2: value_2
        dynamic_key_2: {attr_1: value_3, attr_2: value_4}
root_node:
    static_key:
        - { key: dynamic_key_1, value: [array, of, values] }
        - { key: dynamic_key_2, value: [array, of, values] }
    $rootNode
        ->children()
            ->arrayNode('static_key')
                ->prototype('array')
                    ->children()
                        ->scalarNode('key')->isRequired()->end()
                        ->arrayNode('value')
                            ->prototype('scalar')
                            ->end()
                       ->end()
                    ->end()
                ->end()
            ->end()
        ->end()

您是否尝试过“为了维护数组键,请使用UseAttributesKey()方法:”从本节开始?动态键是否唯一?如果是这样的话,这似乎与我在这个问题/答案中指出的尝试有关:@k0pernikus我做过类似的事情。我觉得奇怪的是,你可以设置Treebuilder来严格接受
dynamic\u key\u 1:{key\u 1:value\u 1,key\u 2:value\u 2,key\u 3:value\u 3}
,但似乎不是
dynamic\u key\u 1:[value\u 1,value\u 2,value\u 3]
@anegrea我在维护这些键方面没有问题。在我设置的其他配置中,它们可以很好地通过。我只是不明白为什么我可以有一种配置,但不能有另一种(见上面的评论)。我猜区别来自yaml:symfony.com/doc/current/components/yaml/yaml_format.html#collections“yaml是一种简单的语言……但与PHP不同,它在数组(序列)和哈希(映射)之间产生了差异。”,正如我在上面的编辑/评论中提到的,但我可能不会以首选的方式进行设置。您的解决方案看起来会起作用。如果
key
的值是重复的,它会出错吗?在我的解决方案中,您可以有许多或所有相同的键,但您可以手动检查,因为static\u key是一个数组。