2014-05-29 2 views
0

Я пытаюсь сделать что-то явно простое.Невозможно правильно проанализировать файл yaml с symfony TreeNode

Я хочу, чтобы разобрать эту YAML структуру:

filters: 
    filter: 
     class: ParentNamespace\MyClassA 
    filter: 
     class: ParentNamespace\MyClassB 
     params: 
     customParam: 5 
     anotherParam: 1 

Итак, я хочу необходимые фильтры узла, который сам по себе может иметь 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

Вы забыли сделать 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(), чтобы потребовать хотя бы один элемент.

Смежные вопросы