2012-10-31 1 views
11

번들의 의미 론적 구성에서 지정된 기본값을 사용하여 배열 노드를 정의해야합니다. 나는 주어진 빈 배열 ([] 또는 array()) 대신 null을 사용할 수 없습니다Symfony 2.1 의미 배열에서 배열 (기본값) 또는 null 허용

my_bundle: 
    foo: ~ 

: 나는 사용자에게 같은 null으로이 배열을 오버라이드 (override) 할 수있는 옵션을 제공 할

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

:처럼이 현재 보이는 []null과 다른 의미를 가져야합니다.

이 방법이 가능합니까? 아니면 추악한 해결 방법이 있습니까? 현재 예외가 발생합니다 :

InvalidTypeException : 경로 "my_bundle.foo"에 대한 유형이 잘못되었습니다. 배열을 예상하지만,

+0

이것을 '스칼라'로 정의했으나 기본값은 '배열'입니다. 배열 유형이 맞습니까? 스칼라는 정수, 부울 값, 문자열입니다. – olegkhuss

+1

프로토 타입은 배열 요소를 나타냅니다. –

답변

15

당신은 같은 것을 시도 할 수 NULL 가지고 : 어쩌면

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

그렇지 않으면 당신이 arrayNode보다는 variableNode을 사용할 수 있습니다; 이렇게하면 더 많은 자유를 얻을 수 있지만 유효성 검사/병합 논리를 병용하지 않아도됩니다.

+0

고마워,하지만 이건'null '대신'null'을 위해'array()'를 얻는 것처럼 보인다. 그래도 다른 선택의 여지가 없다고 생각합니다. 아마도 XML에서 빈 배열에 비해 "null로 대체"를 표현하는 것은 어려울 것입니다 (Yaml에는 그리 많지 않습니다). –

+1

네, 그런 일이 일어날 것입니다. 그러나 나는 이것으로부터 쉽게 벗어날 수 없다고 생각합니다. arrayNode를 정의하면 구성이 병합되고 정규화 된 후 결국 배열을 얻게됩니다. 그렇지 않으면 foo 노드를 variableNode로 간주하는 것이 좋습니다. 그러면 더 자유롭지 만 유효성 검사/병합 로직을 병합하지 않아도됩니다. –

+0

variableNode 부분을 답안에 추가했다면, [null]과 다른 []을 고려할 수있는 방법을 명시 적으로 요구 했으므로 받아 들일 수있었습니다. arrayNode는 내가 원하는 것을 완전히하는 옵션이 아닌 것 같습니다. –

관련 문제