Symfony Config Treebuilder

时间:2015-12-16 22:13:16

标签: symfony

我正在寻找如下配置:

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()
;

但我明白了:

  

路径“root_node.static_key.dynamic_key_1”的类型无效。期望的标量,但得到阵列。

当我切换到:

$rootNode
    ->children()
        ->arrayNode('static_key')
            ->prototype('array')
            ->end()
        ->end()
    ->end()
;

我明白了:

  

“root_node.static_key.dynamic_key_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}

并接收以下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_1: value_3, attr_2: value_4}[value_3, value_4]有什么不同?对我来说,两者都是数组:一个是关联的,另一个不是。

1 个答案:

答案 0 :(得分:3)

不支持动态密钥。

你应该做这样的事情:

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()