Symfony2形成儿童和错误

时间:2015-03-17 09:45:25

标签: php forms symfony error-handling children

我正在建立一个网站范围的搜索表单,而且我无法理解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()see it here)从不检查子表单和getErrorsAsString()see it here)。所以我猜这就是所描述行为背后的原因,所以我的表格有一个儿童形式。

我的问题是为什么有儿童表格以及如何摆脱它?我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

通过将error_bubbling添加到表单类型类中的q字段来解决此问题。

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