我正在建立一个网站范围的搜索表单,而且我无法理解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)。所以我猜这就是所描述行为背后的原因,所以我的表格有一个儿童形式。
我的问题是为什么有儿童表格以及如何摆脱它?我做错了什么?
谢谢!
答案 0 :(得分:0)
通过将error_bubbling
添加到表单类型类中的q
字段来解决此问题。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('q', 'search', array(
'label' => '',
'attr' => array(),
'error_bubbling' => true,
))
;
}