通过buildForm()中的$options访问变量



我想传递一个布尔值给我的DogForm

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

但在我的DogForm做:

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

它总是给我这个错误。

所以我知道狗不应该有猫,但是,我的has_cats选项去了 ?

谢谢。

选项应该传递给createForm()方法,而不是传递给DogForm构造函数:

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

请注意,您必须将"has_cats"也添加到getDefaultOptions()

我将为那些读到这篇文章的人添加一些最佳实践,因为在我提出这个问题的时候,OptionResolver还没有像现在这样先进:

与其检查表单构建器中是否存在"has_cats"选项,不如这样做:

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

这样,如果你忽略了传递"has_cats"选项,它会抛出一个错误,因为你将该选项标记为Required。

如果您想了解更多信息,我建议您阅读选项解析器文档

最新更新