无法使用symfony TreeNode正确解析yaml文件

时间:2014-05-29 17:03:20

标签: php parsing symfony yaml config

我试图做一些看似简单的事情。

我想解析这个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()

1 个答案:

答案 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()来要求至少一个元素。