Symfony2形成子项和错误


Symfony2 Forms children and errors

我正在构建一个站点范围的搜索表单,在理解Symfony2表单结构、子表单和错误处理方面遇到了困难。

我的代码如下:

表单类型

class SearchType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('q', 'search', array(
                'label' => '',
                'attr' => array(),
            ))
        ;
    }
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'AppBundle'Entity'SearchQuery',
            'csrf_protection' => false,
        ));
    }
    public function getName()
    {
        return 'search_form';
    }
}

实体(在上述表单类型中称为data_class

class SearchQuery
{
    /**
     * @Assert'NotBlank()
     * @Assert'Type(type="string", message="form.search.query.validation.type")
     * @Assert'Length(
     *      min = 3,
     *      max = 50
     * )
     */
    protected $q;
    public function __construct($q = '')
    {
        $this->setQ($q);
    }
    public function __toString() {
        return $this->getQ();
    }
    public function getQ()
    {
        return $this->q;
    }
    public function setQ($query)
    {
        $this->q = $query;
    }
}

控制器

$searchForm = $this->createForm(new SearchType());
$searchFormData = array('q' => $q);
$searchForm->submit($searchFormData);
if ($searchForm->isValid()) {
    [...]
}
else {
    // this returns an empty array regardless there are errors or not
    $errors = $searchForm->getErrors(); 
    // this returns errors when they are present
    $errorMessages = $searchForm->getErrorsAsString();
}

您可能会在控制器代码的第二行注意到,我提交的是一个数组,而不是SearchQuery对象。我试过了,但结果并不好,尽管我认为这是正确的方法。

在StackOverflow上挖掘Symfony文档和这里的问题帮助我理解了getErrors()(请参阅此处)从不检查子窗体,而getErrorsAsString()(请参阅这里)会检查子窗体。所以我猜这就是所描述的行为背后的原因,所以,我的表格有一个儿童表格

我的问题是,为什么会有儿童形式存在,以及如何消除它?我做错了什么?

谢谢!

通过将error_bubbling添加到表单类型类的q字段来修复。

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('q', 'search', array(
            'label' => '',
            'attr' => array(),
            'error_bubbling' => true,
        ))
    ;
}