我正在构建一个站点范围的搜索表单,在理解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,
))
;
}