2017-03-13 2 views
1

Comment définir une configuration de regroupement pour laquelle vous ne connaissez pas la structure entière? Par exemple, j'ai un téléchargement de fichier de gestion de paquets, et je voudrais créer des contraintes en utilisant un système "slot". Vous définissez un nom pour votre emplacement, et une configuration associée (par exemple en ajoutant des contraintes), comme ceci:Valeur de nœud générique de générateur d'arbres Symfony3

my_bundle: 
    slots: 
     avatar: 
      constraints: 
       image: 
        max_width: 200 
     cv: 
      constraints: 
       pdf: 
        max_size: 2M 
        other_option_specific_to_pdf: [1, 2, 3] 

Le paquet va alors créer les contraintes et valider votre téléchargement. Le bundle a aucune idée des options qui pourraient être passées à une contrainte, donc je ne peux pas le définir dans le générateur d'arbre.

Des contraintes peuvent être ajoutées à l'aide de balises de services, donc je n'ai aucun moyen de savoir quelle contrainte existera lors de la définition de la configuration du générateur d'arbre.

En ce moment, j'ai la configuration suivante:

$rootNode 
     ->addDefaultsIfNotSet() 
     ->performNoDeepMerging() 
     ->children() 
      ->arrayNode('slots') 
       ->prototype('array') 
        ->children() 
         ->arrayNode('constraints') 
          ->prototype('array') 
           ->prototype('scalar') # Here a constraint may need an array or a more complex object. A "prototype('mixed')" would be handy.. 
           ->end() 
          ->end() 
         ->end() 
        ->end() 
       ->end() 
      ->end() 
     ->end(); 

Y at-il tout en prenant en dessous comme un tableau générique sans traitement du tout un nœud « générique »? Je ne pouvais pas le trouver.

Merci pour votre aide!

EDIT

Merci à la réponse de Mawcel, la configuration corrigée ressemble à ceci:

$rootNode 
     ->addDefaultsIfNotSet() 
     ->performNoDeepMerging() 
     ->children() 
      ->arrayNode('slots') 
       ->prototype('array') 
        ->children() 
         ->arrayNode('constraints') 
          ->prototype('array') 
           ->prototype('variable') # The wildcard I was looking for.. 
           ->end() 
          ->end() 
         ->end() 
        ->end() 
       ->end() 
      ->end() 
     ->end(); 

Répondre

1

Salut vous devez utiliser arrayNode avec useAttributeAsKey, il vous permettra d'avoir des paramètres de configuration avec le nom dynamique :

$rootNode 
    ->arrayNode('slots') 
     ->useAttributeAsKey('name') 
     ->prototype('array') 
     // 

http://symfony.com/doc/current/components/config/definition.html#array-node-optionsVous pouvez également utiliser ->variableNode() pour définir des valeurs de configuration arbitraires.

http://api.symfony.com/2.3/Symfony/Component/Config/Definition/VariableNode.html

+0

Merci! Le "variableNode()" est ce qui me manquait. J'ai simplement remplacé le 'prototype ('scalar')' du niveau le plus bas par 'prototype ('variable')' et ça marche :) – Stnaire