2012-10-31 12 views
11

Tôi cần định nghĩa một nút mảng với một giá trị mặc định đã cho trong cấu hình ngữ nghĩa của gói. Này hiện trông giống như:Cho phép mảng (có giá trị mặc định) hoặc null trong cấu hình ngữ nghĩa của Symfony 2.1

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

tôi muốn cung cấp cho người dùng tùy chọn để ghi đè lên mảng này với null như:

my_bundle: 
    foo: ~ 

tôi không thể sử dụng mảng rỗng ([] hoặc array()) thay vì null cho rằng [] nên có ngữ nghĩa khác nhau từ null.

Điều này có thể xảy ra hoặc có bất kỳ cách giải quyết không xấu nào không? Hiện tại, tôi chỉ nhận được ngoại lệ:

InvalidTypeException: Loại không hợp lệ cho đường dẫn "my_bundle.foo". Dự kiến ​​mảng, nhưng có NULL

+0

Bạn đã xác định giá trị này là 'vô hướng' nhưng giá trị mặc định là 'mảng', nó có phải là loại mảng không? Vô hướng là số nguyên, boolean, chuỗi – olegkhuss

+1

Nguyên mẫu đề cập đến các phần tử của mảng. –

Trả lời

15

Bạn có thể thử một cái gì đó như:

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

Hoặc có lẽ thậm chí đơn giản hơn:

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

Nếu không, bạn có thể sử dụng variableNode chứ không phải là arrayNode; điều này sẽ cho bạn tự do hơn nhưng ít xác nhận/hợp nhất logic ra khỏi hộp.

+0

Cảm ơn, nhưng điều này có vẻ như nếu tôi sẽ nhận được 'mảng()' cho 'null' thay vì' null'. Tôi gần như nghi ngờ rằng không có sự lựa chọn khác, mặc dù. Nó có thể sẽ khó để diễn tả "ghi đè với null" so với mảng trống trong XML, quá (không quá nhiều cho Yaml). –

+1

Vâng, đó là những gì sẽ xảy ra, nhưng tôi nghĩ rằng không có lối thoát dễ dàng từ điều này: nếu bạn định nghĩa một arrayNode bạn cuối cùng sẽ nhận được một mảng sau khi cấu hình đã được sáp nhập và chuẩn hóa. Bạn có thể xem xét việc có nút foo dưới dạng biến variableNode nếu không, điều này sẽ cho bạn nhiều tự do hơn nhưng ít xác nhận/hợp nhất logic ra khỏi hộp. –

+0

Nếu bạn đã thêm phần biếnNode vào câu trả lời, tôi có thể chấp nhận nó, vì tôi đã yêu cầu một cách rõ ràng cho một cách cho phép xem xét [] khác với null. arrayNode dường như không phải là một tùy chọn mà hoàn toàn làm những gì tôi muốn. –