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是一个数组。