2012-08-28 6 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() 

Wiersz 5 powyższego urywka z Symfony\Bundle\FrameworkBundle\DependencyInjection\Configuration używa metody canBeUnset(). Nie wiem, co to robi, ponieważ wydaje się, że nic nie robię, jeśli go usunę. Pracuję nad zrozumieniem konfiguracji semantycznej dla własnych pakietów.Konstruktor drzewa Symfony2 - do czego służy metoda canBeUnset()?

Odpowiedz

6

Po kodzie można znaleźć definicję tej metody w klasie Symfony/Component/Config/Definition/Builder/ArrayNodeDefinition.

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

    return $this; 
} 

ta jest przekazywana do MergeBuilder (Symfony/Component/Config/Definition/Builder/MergeBuilder), który obsługuje konfiguracyjny połączeniu.

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

    return $this; 
} 

Więc moje zrozumienie jest, że metoda ta definiuje, jeśli wartość config może być wyłączony podczas scalania konfiguracje, w przypadku nadrzędnym config nie obsługuje wartości. Musiałbym jednak przetestować, aby dowiedzieć się, czy zachowanie nie jest dozwolone, ale myślę, że wtedy wyrzuciłoby wyjątek dotyczący brakującej wartości konfiguracyjnej, podobnie jak isRequired.

+0

Ale jak usunąć wartość konfiguracji? Na przykład 'framework.profiler' jest ustawiony w' config_dev.yml' i 'config_test.yml' zawiera' config_dev.yml'. Profiler jest wyłączony tylko wtedy, gdy nie ma takiego klucza konfiguracyjnego 'framework.profiler'. Jak mogę to wyłączyć? Ustawienie na '{}' lub '~' nie działało. (Symfony 2.1, wiem, że można to zrobić od wersji 2.2 za pomocą 'framework.profiler.enabled'). – flu

+1

Aby usunąć wartość, należy użyć 'form: false' (' {} 'i' ~ 'nie anulują jej). – flu