handleRequest之前的表单:没有全局错误。
Form {#1852 ▼
-config: FormBuilder {#1851 ▶}
-parent: null
-children: OrderedHashMap {#1836 ▶}
-errors: []
-submitted: false
-clickedButton: null
-modelData: User {#2096 ▶}
-normData: User {#2096 ▶}
-viewData: User {#2096 ▶}
-extraData: []
-synchronized: true
-defaultDataSet: true
-lockSetData: false
}
请求:'firstname'字段已通过。
Request {#3 ▼
+attributes: ParameterBag {#6 ▶}
+request: ParameterBag {#4 ▼
#parameters: array:1 [▼
"registration" => array:6 [▼
"firstname" => "foo"
"lastname" => "bar"
"email" => "foo@test.com"
"accountType" => "bbbbbb"
"school_info" => array:4 [▶]
"_token" => "1a55e2d7474183267374a0007e15b92e6114158d"
]
]
}
...
}
handleRequest之后的表单:来自“firstname”字段的错误消息的全局错误,但字段本身没有错误。
Form {#1852 ▼
-config: FormBuilder {#1851 ▶}
-parent: null
-children: OrderedHashMap {#1836 ▼
-elements: array:5 [▼
"firstname" => Form {#1835 ▼
-config: FormBuilder {#1854 ▶}
-parent: Form {#1852}
-children: OrderedHashMap {#1853 ▶}
-errors: []
-submitted: true
-clickedButton: null
-modelData: "poipoi"
-normData: "poipoi"
-viewData: "poipoi"
-extraData: []
-synchronized: true
-defaultDataSet: true
-lockSetData: false
}
"email" => Form {#1858 ▶}
"lastname" => Form {#1861 ▶}
"accountType" => Form {#1864 ▶}
"school_info" => Form {#1867 ▶}
]
-orderedKeys: array:5 [▶]
-managedCursors: []
}
-errors: array:3 [▼
0 => FormError {#728 ▼
-message: "missing email"
#messageTemplate: "missing email"
#messageParameters: array:1 [▶]
#messagePluralization: null
}
1 => FormError {#733 ▼
-message: "missing firstname"
#messageTemplate: "missing firstname"
#messageParameters: array:1 [▶]
#messagePluralization: null
}
2 => FormError {#738 ▼
-message: "missing lastname"
#messageTemplate: "missing lastname"
#messageParameters: array:1 [▶]
#messagePluralization: null
}
]
-submitted: true
-clickedButton: null
-modelData: User {#2096 ▶}
-normData: User {#2096 ▶}
-viewData: User {#2096 ▶}
-extraData: []
-synchronized: true
-defaultDataSet: true
-lockSetData: false
}
“firstname”,“lastname”和“email”的问题相同。注意错误是如何对表单全局的,并且字段本身没有错误。此外,错误冒泡不会影响问题。
表格类型:
<?php
namespace Acme\SiteBundle\Form\Type;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Acme\SiteBundle\Entity\User;
/**
*
*/
class RegistrationType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('firstname', null, array('label' => 'firstname'))
->add('lastname', null, array('label' => 'lastname'))
->add('email', 'email', array('label' => 'form.email'))
->add('accountType', 'choice'));
$builder->add('school_info', 'school_info', array(
'label' => 'School',
'cascade_validation' => false,
'mapped' => false,
'required' => false,
));
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\\SiteBundle\\Entity\\User',
'intention' => 'registration',
'validation_groups' => function (FormInterface $form) {
$data = $form->getData();
if ($this->isPro($data)) {
return array('HKCustomRegistration', 'account_type_pro');
} else {
return array('HKCustomRegistration', 'account_type');
}
},
'cascade_validation' => true,
));
}
public function getName()
{
return 'registration';
}
}
嵌入表格(school_info)表格类型。
关键点:只有当school_info表单作为注册表单中的字段添加并且填写了shool输入时才会出现此问题(如果未填写,则不会发生错误)。
<?php
namespace Acme\SiteBundle\Form\Type;
use Acme\SiteBundle\Service\SiteProvider;
use Acme\SiteBundle\Entity\School;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
use Doctrine\ORM\EntityRepository;
class SchoolInfoType extends AbstractType
{
private $site;
public function __construct(SiteProvider $siteProvider)
{
$this->site = $siteProvider->getCurrentSiteDB();
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$site = $this->site;
$builder
->add('school', 'entity', array(
'empty_value' => '------------',
'class' => 'AcmeSiteBundle:School',
'query_builder' => function (EntityRepository $er) use ($site) {
return $er->createQueryBuilder('sc')
->where('sc.site = :site')
->setParameter('site', $site)
->addOrderBy('sc.name', 'ASC');
},
'mapped' => true, // mapped but not persisted
'label' => 'school',
));
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\SiteBundle\Entity\User',
'site' => null,
));
}
public function getName()
{
return 'school_info';
}
实体中的验证限制:
/**
* @var string
*
* @ORM\Column(name="firstname", type="string", length=100, nullable=true)
* @Assert\NotBlank(groups={"HKCustomRegistration", "HKCustomProfile", "Default", "sylius"}, message="missing firstname")
*/
private $firstname;
答案 0 :(得分:0)
好的,所以这是一个验证组错误!
schoolInfoType
针对默认验证组验证了User
实体,默认验证组需要'firstname'
,'lastname'
和'email'
。
这有点误导,因为这些字段填写在父表单中。
(不确定'mapped' => false
是否在此处发挥作用)。
无论如何,我的解决方案是添加一个没有相关约束的验证组SchoolInfoType
:
<?php
class SchoolInfoType extends AbstractType
{
//...
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Acme\SiteBundle\Entity\User',
'validation_groups' => array('school'),
'site' => null,
));
}
}
?>