2013-04-18 45 views
3

用下面的配置樹:停止Symfony 2配置處理器添加一個空數組?

$rootNode 
    ->fixXmlConfig('parameter') 
    ->children() 
     ->arrayNode('parameters') 
      ->useAttributeAsKey('name') 
      ->prototype('array') 
       ->children() 
        ->scalarNode('type')->end() 
        ->scalarNode('value')->end() 
       ->end() 
      ->end() 
     ->end() 
    ->end(); 

......就算我不指定parameters鍵,Symfony的是添加一個空數組:

$config = $processor->processConfiguration($configuration, array()); 
var_dump($config); // Output is array('parameters' => array()) 

但我想parameters關鍵未設置,不存在,如果沒有參數。

我試過在beforeNormalization刪除鍵(如果爲空),但它不工作:

$rootNode 
    ->beforeNormalization() 
     ->always(function ($v) { 
      if(empty($v['parameters'])) { 
       unset($v['parameters']); 
      } 

      return $v; 
     }) 

似乎與一個空數組中永遠不會執行規範化回調之前。

回答

0

數組節點將確保配置鍵的標準化值始終是數組,並且沒有別的東西,即使沒有提供(在這種情況下,您會得到一個空數組)。

我認爲在處理完成後處理這個配置項(總是數組)會更有意義,而不是試圖擺脫配置處理器返回結果中的這個鍵。例如,如果它是空的,你可以取消它。

$config = $processor->processConfiguration($configuration, array()); 
if(empty($config['parameters'])) { 
    unset($config['parameters']); 
} 
+0

的問題是我必須在配置本身內部執行一些驗證,並且需要檢查參數是否爲空。 – gremo

+0

它在我看來,如果沒有提供配置密鑰,標準化和驗證回調將不會運行。您可以將'isRequired()'添加到您的陣列節點定義中,以確保提供了該配置密鑰。也許這可以幫助? – gatisl

0

Gremo,你已經差不多成功了。您嘗試過beforeNormalization,但parameters鍵是歸一化的結果,所以它在歸一化後出現。因此,我們應該使用一些定稿日常如:

$rootNode->validate() 
    ->always(function($val) { 
     if (empty($val['parameters'])) { 
      unset($val['parameters']); 
     } 

     return $val;}) 
    ->end() 
0

在我看來,你應該只使用TreeBuilder作爲NodeDefinition API說這是應爲空,如果不設置:

$rootNode 
    ->fixXmlConfig('parameter') 
    ->children() 
     ->arrayNode('parameters') 
      ->useAttributeAsKey('name') 
      ->prototype('array') 
       ->children() 
        ->scalarNode('type')->end() 
        ->scalarNode('value')->end() 
       ->end() 
      ->end() 
       ->defaultNull() /////// defaults to null OR 
       ->setAddIfNotSet(false) 
     ->end() 

    ->end();