2012-01-02 33 views
9

Tôi muốn vượt qua một boolean để tôi DogForm

$dogForm = new DogForm(null, array("has_cats" => $this->getUser()->hasCats())); 

$form = $this->createForm($dogForm, $dog); 

Nhưng khi làm trong DogForm tôi:

if (!isset($options['has_cats'])) { 
    throw new \Exception("Missing option has_cats, this option is mandatory");   
} 

Nó luôn luôn cho tôi lỗi này.

Vì vậy, tôi biết rằng chó không được phép có mèo nhưng, nơi tùy chọn has_cats của tôi đã đi?

Cảm ơn.

Trả lời

24

Tùy chọn nên được truyền cho phương thức createForm(), không DogForm constructor của bạn:

$form = $this->createForm(new DogForm(), $dog, array('has_cats' => $cats)); 

tâm, mà bạn phải thêm "has_cats" để getDefaultOptions() cũng

+8

Cảm ơn Kris. Chỉ cần để biết khác nếu họ đọc đó, bạn sẽ phải thêm "has_cats" trong getDefaultOptions() quá trong CatForm. –

11

tôi sẽ thêm một số tốt nhất thực hành cho những người sẽ đọc điều này, bởi vì tại thời điểm tôi hỏi câu hỏi OptionResolver không cao cấp như bây giờ:

Thay vì kiểm tra sự hiện diện của tùy chọn.210 trong xây dựng hình thức, nó tốt hơn để làm:

public function setDefaultOptions(OptionResolverInterface $resolver) 
{ 
    $resolver->setRequired(array(
     'has_cats', 
    )); 

    $resolver->setDefaults(array(
     'has_cats' => null, 
    )); 
} 

cách này, nếu bạn bỏ qua để vượt qua "has_cats" tùy chọn, nó sẽ ném ra một lỗi nguyên nhân bạn đánh dấu tùy chọn theo yêu cầu.

Nếu bạn muốn biết thêm thông tin, tôi khuyên bạn nên read the option resolver documentation

+0

+1 Để cập nhật câu trả lời của Kris. – flu

Các vấn đề liên quan