2012-10-31 2 views
11

Devo definire un nodo array con un determinato valore predefinito nella configurazione semantica di un bundle. Questo appare attualmente come:Consenti array (con valore predefinito) o null nella configurazione semantica di Symfony 2.1

$node->arrayNode('foo') 
     ->prototype('scalar')->end() 
     ->defaultValue(array('1', '2', '3')) 
    ->end(); 

voglio dare all'utente la possibilità di ignorare questo array con null come:

my_bundle: 
    foo: ~ 

non posso usare le matrici vuote ([] o array()) invece di null dato che [] dovrebbe avere semantica diversa da null.

È possibile o ci sono soluzioni alternative non brutte? Attualmente ottengo solo un'eccezione:

InvalidTypeException: tipo non valido per il percorso "my_bundle.foo". allineamento previsto, ma ha ottenuto NULL

+0

Questo è stato definito come "scalare", ma il valore predefinito è "array", dovrebbe essere un tipo di matrice? Scalare è intero, booleano, stringa – olegkhuss

+1

Il prototipo si riferisce agli elementi dell'array. –

risposta

15

si potrebbe provare qualcosa di simile:

$node->arrayNode('foo') 
    ->beforeNormalization() 
     ->ifTrue(function($v) { return $v === null; }) 
     ->then(function($v) { return array(); }) 
    ->end() 
    ->prototype('scalar')->end() 
    ->defaultValue(array('1', '2', '3')) 
->end(); 

O forse il più semplice anche:

$node->arrayNode('foo') 
    ->treatNullLike(array()) 
    ->prototype('scalar')->end() 
    ->defaultValue(array('1', '2', '3')) 
->end(); 

In caso contrario è possibile utilizzare il variableNode piuttosto che l'arrayNode; questo ti darà più libertà ma meno logica di validazione/fusione fuori dalla scatola.

+0

Grazie, ma sembra che otterrò 'array()' per 'null' invece di' null'. Ho quasi il sospetto che non ci sia altra scelta, però. Sarebbe probabilmente difficile esprimere "override with null" rispetto a un array vuoto anche in XML (non tanto per Yaml). –

+1

Sì, questo è ciò che accadrà, ma penso che non ci sia una facile fuga da questo: se si definisce un arrayNode si otterrà un array dopo che la configurazione è stata unita e normalizzata. Potresti considerare di avere il nodo foo come variabileNodo altrimenti, che ti darà più libertà ma meno logica di validazione/fusione fuori dalla scatola. –

+0

Se hai aggiunto la parte variableNode alla risposta, potrei accettarla, dato che ho chiesto esplicitamente un modo che consenta di considerare [] diverso da null. arrayNode non sembra essere un'opzione che fa completamente ciò che voglio. –