2012-01-02 12 views
9

Chcę przekazać wartość logiczną do mojego DogForm

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

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

Ale kiedy robisz w moim DogForm:

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

Zawsze mi dać ten błąd.

Więc wiem, że psy nie powinny mieć kotów, ale , gdzie moja opcja has_cats poszła?

Dzięki.

Odpowiedz

24

opcje powinny być przekazywane do metody createForm(), nie do konstruktora DogForm:

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

pamiętać, że trzeba dodać „has_cats” do getDefaultOptions() także

+8

Dzięki Kris. Aby inni wiedzieli, że to czytają, będziesz musiał dodać "has_cats" również w getDefaultOptions() w CatForm. –

11

dodam jakiś najlepszy praktyka dla tych, którzy to przeczytają, ponieważ w momencie, gdy zadałem pytanie, OptionResolver nie był tak zaawansowany, jak jest teraz:

Zamiast sprawdzać obecność opcji "has_cats" w konstruktora formularza, to lepiej zrobić:

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

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

ten sposób, jeśli pominąć, aby przejść do opcji "has_cats", będzie ona rzucać błąd bo zaznaczono opcję w miarę potrzeb.

Jeśli chcesz uzyskać więcej informacji, którą proponujemy, aby read the option resolver documentation

+0

+1 Za aktualizowanie odpowiedzi Krisa. – flu

Powiązane problemy