2012-08-28 7 views
5
$rootNode 
    ->children() 
     ->arrayNode('form') 
      ->info('form configuration') 
      ->canBeUnset() 
      ->treatNullLike(array('enabled' => true)) 
      ->treatTrueLike(array('enabled' => true)) 
      ->children() 
       ->booleanNode('enabled')->defaultTrue()->end() 
      ->end() 
     ->end() 

Zeile 5 des obigen Snippets von Symfony\Bundle\FrameworkBundle\DependencyInjection\Configuration verwendet die Methode canBeUnset(). Ich weiß nicht, was das bedeutet, weil es nichts zu tun scheint, wenn ich es entferne. Ich arbeite daran, die semantische Konfiguration für meine eigenen Bündel zu verstehen.Symfony2 Tree Builder - Was macht die Methode canBeUnset()?

Antwort

6

Nach dem Code finden Sie die Definition für diese Methode in Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition Klasse. Diese

/** 
* Sets whether the node can be unset. 
* 
* @param Boolean $allow 
* 
* @return ArrayNodeDefinition 
*/ 
public function canBeUnset($allow = true) 
{ 
    $this->merge()->allowUnset($allow); 

    return $this; 
} 

wird weitergegeben MergeBuilder (Symfony/Component/Config/Definition/Builder/MergeBuilder), die Config Verschmelzen abwickelt.

/** 
* Sets whether the node can be unset. 
* 
* @param Boolean $allow 
* 
* @return MergeBuilder 
*/ 
public function allowUnset($allow = true) 
{ 
    $this->allowFalse = $allow; 

    return $this; 
} 

Also mein Verständnis ist, dass diese Methode definiert, wenn die Config Wert ungesetzt werden kann, während Konfigurationen Verschmelzung, falls die übergeordnete Konfiguration nicht den Wert unterstützen. Ich müsste zwar testen, um das Verhalten herauszufinden, wenn die Unscharfschaltung nicht erlaubt ist, aber ich denke, dann würde es eine Ausnahme über einen fehlenden Konfigurationswert genauso wie isRequired werfen.

+0

Aber wie deaktivierst du einen Konfigurationswert? Zum Beispiel wird 'framework.profiler' in' config_dev.yml' gesetzt und 'config_test.yml' enthält' config_dev.yml'. Der Profiler wird nur deaktiviert, wenn es keinen solchen Konfigurationsschlüssel 'framework.profiler' gibt. Wie kann ich es aufheben? Die Einstellung auf '{}' oder '~' hat nicht funktioniert. (Symfony 2.1, ich weiß, dass dies ab 2.2 mit 'framework.profiler.enabled' gemacht werden kann). – flu

+1

Um den Wert tatsächlich zu deaktivieren, verwenden Sie 'form: false' (' {} 'und' ~ 'wird nicht deaktiviert). – flu

Verwandte Themen