我试图做一些看似简单的事情。
我想解析这个yaml结构:
filters:
filter:
class: ParentNamespace\MyClassA
filter:
class: ParentNamespace\MyClassB
params:
customParam: 5
anotherParam: 1
所以,我想要一个必需的过滤器节点,它本身可以有一个或多个过滤节点。然后每个人都必须有一个班级'节点并有一个可选的params数组节点。
我尝试使用这个TreeBuilder,但它只使用了第二个过滤器,我想知道是否覆盖了第一个过滤器。
我尝试了一切,但却无法正常工作。
->arrayNode('filters')
->isRequired()
->children()
->arrayNode('filter')
->children()
->scalarNode('class')
->isRequired()
->end()
->arrayNode('params')
->defaultValue(array())
->prototype('variable')->end()
->end()
->end()
->end()
->end()
->end()
答案 0 :(得分:1)
您忘记将filter
节点设为原型数组节点。现在它覆盖了自己,因为ArrayNode只能出现一次:
->arrayNode('filters')
->isRequired()
->children()
->arrayNode('filter')
->prototype('array')
->children()
->scalarNode('class')
->isRequired()
->end()
->arrayNode('params')
->defaultValue(array())
->prototype('variable')->end()
->end()
->end()
->end()
->end()
->end()
->end()
除此之外,我建议你改用这样的东西:
filters:
ParentNamespace\MyClassA: ~
ParentNamespace\MyClassB:
params:
customParam: 5
anotherParam: 1
它更友好,允许您支持XML:
->fixXmlConfig('filter')
->children()
->arrayNode('filters')
->useAttributeAsKey('class')
->prototype('array')
->children()
->arrayNode('params')
->defaultValue(array())
->prototype('variable')->end()
->end()
->end()
->end()
->end()
->end()
最后,我建议您使用requiresAtLeastOneElement()
代替isRequired()
来要求至少一个元素。