2013-04-18 2 views
3

Avec l'arbre de configuration suivante:Arrêt du processeur de configuration Symfony 2 de l'ajout d'un tableau vide?

$rootNode 
    ->fixXmlConfig('parameter') 
    ->children() 
     ->arrayNode('parameters') 
      ->useAttributeAsKey('name') 
      ->prototype('array') 
       ->children() 
        ->scalarNode('type')->end() 
        ->scalarNode('value')->end() 
       ->end() 
      ->end() 
     ->end() 
    ->end(); 

... même si je ne précise pas la clé parameters, Symfony ajoute un tableau vide:

$config = $processor->processConfiguration($configuration, array()); 
var_dump($config); // Output is array('parameters' => array()) 

Mais je veux la clé parameters désactivé, absent, s'il n'y a pas de paramètres.

J'ai essayé de supprimer la clé (si elle est vide) dans beforeNormalization, mais il ne fonctionne pas:

$rootNode 
    ->beforeNormalization() 
     ->always(function ($v) { 
      if(empty($v['parameters'])) { 
       unset($v['parameters']); 
      } 

      return $v; 
     }) 

Semble que, avec un tableau vide avant le rappel de normalisation est jamais exécutée.

Répondre

0

Le noeud de tableau s'assurera que la valeur normalisée de la clé de configuration sera toujours le tableau et rien d'autre, même si rien n'est fourni (dans ce cas, vous obtenez un tableau vide). Au lieu d'essayer de se débarrasser de cette clé dans le résultat retourné du processeur de configuration, je pense qu'il serait plus logique de gérer cet élément de configuration (qui sera toujours array) une fois le traitement terminé. Par exemple, vous pouvez le désactiver s'il est vide.

$config = $processor->processConfiguration($configuration, array()); 
if(empty($config['parameters'])) { 
    unset($config['parameters']); 
} 
+0

Le problème est Je dois effectuer une validation dans la configuration elle-même, et j'ai besoin de vérifier si les paramètres sont vides ou non. – gremo

+0

Il me semble que les rappels de normalisation et de validation ne sont pas exécutés si la clé de configuration n'est pas fournie. Vous pouvez ajouter 'isRequired()' à votre définition de noeud de tableau pour vous assurer que cette clé de configuration est fournie. Peut-être que cela peut aider? – gatisl

0

Gremo, vous avez presque réussi à le faire fonctionner. Vous avez essayé beforeNormalization, mais la clé parameters est le résultat de la normalisation, il apparaît donc APRÈS la normalisation. Nous devons donc utiliser une routine mise au point définitive comme:

$rootNode->validate() 
    ->always(function($val) { 
     if (empty($val['parameters'])) { 
      unset($val['parameters']); 
     } 

     return $val;}) 
    ->end() 
0

À mon avis, vous devez simplement utiliser l'API treeBuilder NodeDefinition dire que c'est devrait être nulle si sa valeur est:

$rootNode 
    ->fixXmlConfig('parameter') 
    ->children() 
     ->arrayNode('parameters') 
      ->useAttributeAsKey('name') 
      ->prototype('array') 
       ->children() 
        ->scalarNode('type')->end() 
        ->scalarNode('value')->end() 
       ->end() 
      ->end() 
       ->defaultNull() /////// defaults to null OR 
       ->setAddIfNotSet(false) 
     ->end() 

    ->end(); 
Questions connexes