2012-10-31 11 views
11

Potrzebuję zdefiniować węzeł tablicy z daną wartością domyślną w semantycznej konfiguracji pakietu. To obecnie wygląda następująco:Zezwalaj na tablicę (z wartością domyślną) lub null w konfiguracji semantycznej Symfony 2.1

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

chcę dać opcję, aby zastąpić tę tablicę z null jak użytkowniku:

my_bundle: 
    foo: ~ 

nie mogę używać pustych tablic ([] lub array()) zamiast null zważywszy, że [] powinna mieć inną semantykę od null.

Czy to możliwe lub istnieją jakieś nieszkodliwe rozwiązania? Obecnie otrzymuję wyjątek:

InvalidTypeException: Niepoprawny typ dla ścieżki "my_bundle.foo". Oczekuje tablicę, ale dostał NULL

+0

Zdefiniowałeś to jako "skalarne", ale domyślną wartością jest 'tablica', czy powinien to być typ tablicy? Scalar jest liczbą całkowitą, boolean, ciągiem – olegkhuss

+1

Prototyp odnosi się do elementów tablicy. –

Odpowiedz

15

można spróbować coś takiego:

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

a może nawet prostsza:

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

W przeciwnym wypadku można użyć variableNode zamiast arrayNode; Zapewni to większą swobodę, ale mniejszą walidację/scalanie logiki po wyjęciu z pudełka.

+0

Dzięki, ale wygląda na to, że otrzymam 'array()' dla 'null' zamiast' null'. Niemal podejrzewam, że nie ma innego wyboru. Prawdopodobnie trudno byłoby wyrazić "override with null" w porównaniu z pustą tablicą w XML-u (nie w przypadku Yaml). –

+1

Tak, właśnie to się stanie, ale myślę, że nie ma łatwego wyjścia z tego: jeśli zdefiniujesz nodeNode, otrzymasz tablicę po scaleniu i znormalizowaniu konfiguracji. Można rozważyć, aby w przeciwnym razie mieć węzeł foo jako zmiennąNode, co zapewni większą swobodę, ale mniejszą logikę sprawdzania/scalania po wyjęciu z pudełka. –

+0

Po dodaniu części variableNode do odpowiedzi, mógłbym ją zaakceptować, biorąc pod uwagę, że wyraźnie poprosiłem o sposób, który pozwala rozważyć [] inny niż zerowy. arrayNode nie wydaje się być opcją, która w pełni robi to, co chcę. –

Powiązane problemy