在Symfony 2.1语义配置中允许数组(具有默认值)或null

时间:2012-10-31 00:23:58

标签: arrays symfony symfony-2.1

我需要在bundle的语义配置中定义一个具有给定默认值的数组节点。目前看起来像这样:

$node->arrayNode('foo')
         ->prototype('scalar')->end()
         ->defaultValue(array('1', '2', '3'))
     ->end();

我想让用户选择使用null覆盖此数组,如:

my_bundle:
  foo: ~

我不能使用空数组([]array())代替null,因为[]应该具有与null不同的语义。

这是可能的还是有任何非丑陋的解决方法?目前我只是得到一个例外:

  

InvalidTypeException:路径“my_bundle.foo”的类型无效。预期数组,但得到NULL

1 个答案:

答案 0 :(得分:18)

您可以尝试以下方式:

$node->arrayNode('foo')
     ->beforeNormalization()
       ->ifTrue(function($v) { return $v === null; })
       ->then(function($v) { return array(); })
     ->end()
     ->prototype('scalar')->end()
     ->defaultValue(array('1', '2', '3'))
 ->end();

或者更简单:

$node->arrayNode('foo')
     ->treatNullLike(array())
     ->prototype('scalar')->end()
     ->defaultValue(array('1', '2', '3'))
 ->end();

否则你可以使用variableNode而不是arrayNode;这将为您提供更多自由,但开箱即用的验证/合并逻辑更少。