Разрешить массив (со значением по умолчанию) или null в семантической конфигурации Symfony 2.1

Мне нужно определить массив node с заданным значением по умолчанию в семантической конфигурации пучка. В настоящее время это выглядит так:

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

Я хочу дать пользователю возможность переопределить этот массив с помощью null like:

my_bundle:
  foo: ~

Я не могу использовать пустые массивы ([] или array()) вместо null, учитывая, что [] должен иметь разную семантику из null.

Это возможно или есть какие-то некрасивые обходные пути? В настоящее время я просто получаю исключение:

InvalidTypeException: недопустимый тип для пути "my_bundle.foo". Ожидаемый массив, но получил NULL

Ответ 1

Вы можете попробовать что-то вроде:

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

В противном случае вы можете использовать переменнуюNode, а не arrayNode; это даст вам больше свободы, но меньше логики проверки/слияния из коробки.