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

Symfony\Bundle\FrameworkBundle\DependencyInjection\Configuration의 위 코드 중 5 번째 줄에는 canBeUnset()이라는 방법이 사용됩니다. 나는 그것을 제거하면 아무 것도하지 않는 것처럼 보이기 때문에이 일이 무엇인지 모릅니다. 나는 내 번들을위한 의미 론적 구성을 이해하고있다.Symfony2 트리 빌더 -이 메소드는 canBeUnset()에서 무엇을합니까?

답변

6

코드에 이어이 메서드에 대한 정의는 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; 
} 

이는 구성 병합 처리 MergeBuilder (Symfony/Component/Config/Definition/Builder/MergeBuilder)에 전달된다.

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

    return $this; 
} 

그래서 내 이해는 최우선 설정이 값을 지원하지 않는 경우, 구성을 병합하는 동안 설정 값이 해제 될 수 있다면이 방법은, 정의하는 것이다. unsetting이 허용되지 않는 경우 동작을 알아 내기 위해 테스트해야하지만, isRequired처럼 누락 된 구성 값에 대한 예외가 발생합니다.

+0

하지만 어떻게 구성 값을 설정 해제합니까? 예를 들어'framework.profiler'는'config_dev.yml'에 설정되고'config_test.yml'에는'config_dev.yml'이 포함됩니다. 프로파일 러는 'framework.profiler'같은 설정 키가없는 경우에만 비활성화됩니다. 어떻게하면 설정을 해제 할 수 있습니까? '{}'또는'~'로 설정하면 작동하지 않습니다. (Symfony 2.1, 2.2에서'framework.profiler.enabled'로 이것을 수행 할 수 있습니다.) – flu

+1

실제로 값을 설정 해제하려면'form : false' ('{}'와'~'는 그것을 해제하지 않습니다)를 사용하십시오. – flu

관련 문제