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,
))
;
}
我正在构建一个 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,
))
;
}