Symfony2 表格 children 和错误

Symfony2 Forms children and errors

我正在构建一个 site-wide 搜索表单,但我无法理解 Symfony2 表单结构,关于 children 表单和错误处理。

我的代码如下所示:

表单类型

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 object。我试过了,但效果不佳,尽管我认为这是正确的方法。

深入研究 Symfony 文档和 Whosebug 上的问题帮助我理解 getErrors() (see it here) never checks children forms and getErrorsAsString() (see it here) 确实如此。所以我猜这就是所描述行为背后的原因,所以我的表单有一个 child 表单。

我的问题是为什么会出现 child 表单以及如何删除它?我做错了什么?

谢谢!

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

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