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

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; 
} 

だから私の理解では、最優先の設定値をサポートしていない場合には、コンフィギュレーションをマージしながら、あなたの設定値を設定解除することができた場合、このメソッドは、定義されていること、です。私は、設定を解除することができない場合の動作を調べるために、テストしなければならないでしょうが、それはちょうどisRequiredのような欠落した設定値に関する例外をスローすると思います。

+0

しかし、どのように設定値を設定解除しますか?例えば、 'framework.profiler'は' config_dev.yml'に設定され、 'config_test.yml'は' config_dev.yml'を含みます。このような設定キー 'framework.profiler'がない場合、プロファイラは無効になります。どうすればそれを解除できますか? '{}'や '〜'に設定しても動作しませんでした。 (symfony 2.1では、これは 'framework.profiler.enabled'で2.2で行うことができます)。 – flu

+1

実際に値を設定解除するには、 'form:false'(' {} 'と'〜 'はそれを設定解除しません)を使います。 – flu

関連する問題