2012-10-31 2 views
11

Ich muss einen Array-Knoten mit einem vorgegebenen Standardwert in der semantischen Konfiguration eines Pakets definieren. Das sieht derzeit wie:Zulassen Array (mit Standardwert) oder Null in Symfony 2.1 semantische Konfiguration

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

ich dem Benutzer die Möglichkeit geben will, dieses Array außer Kraft zu setzen mit null wie:

my_bundle: 
    foo: ~ 

ich nicht leerer Arrays verwenden kann ([] oder array()) statt null da [] sollte eine andere Semantik haben als null.

Ist dies möglich oder gibt es nicht-hässliche Workarounds? Derzeit erhalte ich nur eine Ausnahme:

InvalidTypeException: Ungültiger Typ für den Pfad "my_bundle.foo". Erwartete Array, bekam aber NULL

+0

Sie haben dies als 'Skalar' definiert, aber der Standardwert ist 'array', sollte es Array-Typ sein? Skalar ist Ganzzahl, Boolean, String – olegkhuss

+1

Der Prototyp bezieht sich auf die Elemente des Arrays. –

Antwort

15

Sie etwas versuchen könnte wie:

$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(); 

Oder vielleicht die sogar simplier:

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

Andernfalls können Sie den variableNode verwenden, anstatt die arrayNode; Dies gibt Ihnen mehr Freiheit, aber weniger Validierung/Zusammenführung von Logik aus der Box.

+0

Danke, aber das sieht so aus, als würde ich 'array()' für 'null' anstelle von' null' erhalten. Ich vermute fast, dass es keine andere Wahl gibt. Es wäre wahrscheinlich schwierig, "override with null" vs. leeres Array auch in XML auszudrücken (nicht so sehr für Yaml). –

+1

Ja, das wird passieren, aber ich denke, dass es kein leichtes Entkommen gibt: Wenn Sie einen ArrayNode definieren, erhalten Sie schließlich ein Array, nachdem die Konfiguration zusammengeführt und normalisiert wurde. Sie könnten den foo-Knoten als Variablenknoten verwenden, was Ihnen mehr Freiheit, aber weniger Validierungs-/Zusammenführungslogik aus der Box gibt. –

+0

Wenn Sie den Variablenknoten-Teil zu der Antwort hinzugefügt haben, könnte ich das akzeptieren, vorausgesetzt, dass ich explizit nach einem Weg gefragt habe, der es erlaubt, [] anders als null zu betrachten. ArrayNode scheint keine Option zu sein, die voll macht, was ich will. –

Verwandte Themen