Symfony 嵌入式表单验证
Symfony Embedded Form Validation
我有几个实体,它们以单一形式使用,从抽象 class 扩展而来。
我为每个实体创建了一个表单类型,然后将它们嵌入到父表单中。
我想根据组执行验证,因此 EmailType 必须检查 "elemento" 属性 仅在 Assert\NotBlank(默认组)和 Assert\Email(电子邮件组),Telefono 必须检查 Assert\NotBlank(默认组)和 Assert\Regex(phone 组)。
根据我的配置,执行了两个检查(约束),因此在电子邮件约束和正则表达式上检查了电子邮件,因此 phone 文件是...我哪里错了?
收集电子邮件和 phone 的工作人员实体已配置 Assert\Valid() 约束
这就是例子
家长表格
<?php
namespace App\Form\Staff;
class StaffType extends AbstractType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(['data_class' => \Cowbell\Entity\Staff\Staff::class,
'validation_groups' => ['Default', 'email', 'phone']]);
}
/**
*
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
// ... Other field of Staff Entity
->add('emails', CollectionType::class, ['label' => 'admin.emails',
'entry_type' => \App\Form\Contatto\CBEmailType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'empty_data' => null,
'translation_domain' => 'admin',
'validation_groups' => ['email']])
->add('telefoni', CollectionType::class, ['label' => 'admin.phones',
'entry_type' => \App\Form\Contatto\CBTelefonoType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'empty_data' => null,
'translation_domain' => 'admin',
'validation_groups' => ['phone']]);
}
}
然后是 CBEmailType
<?php
namespace App\Form\Contatto;
class CBEmailType extends AbstractType{
/**
*
* @param OptionsResolver $resolver
*/
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => \App\Entity\Contatto\Email::class,
'validation_groups' => ['Default', 'email']]);;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('elemento', EmailType::class, ['label' => 'admin.email',
'translation_domain' => 'admin'])
}
}
CBTelefonoType
<?php
namespace App\Form\Contatto;
class CBTelefonoType extends AbstractType{
/**
*
* @param OptionsResolver $resolver
*/
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => \Cowbell\Entity\Contatto\Telefono::class,
'validation_groups' => ['Default', 'phone']]);
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('elemento', TextType::class, ['label' => 'admin.phone',
'translation_domain' => 'admin'])
}
}
电子邮件和电话都扩展
<?php
namespace App\Entity\Contact;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
abstract class AbstractElementoContact {
/**
*
* @var string
*
* @ORM\Column(name="elemento", type="string", length=100, nullable=false)
* @Assert\NotBlank()
* @Assert\Email(strict=true, checkHost=true, checkMX=true, groups={"email"})
* @Assert\Regex("/[0-9]{6,50}/", groups={"phone"})
*/
protected $elemento;
AFAIK 你不能在 CollectionType
表单字段上设置 validation_groups
(分别你可以设置它,但它没有效果),所以整个表单,包括子集集合中的表单始终通过在整个父表单上设置的 validation_groups
进行验证。
validation_groups
的目的是为了不同的目的(例如,创建新的与编辑现有的)允许约束修改对象的属性,但不适用于您上面描述的内容。
考虑一下,如果可能的话,将您当前的电子邮件和电话作为 属性 直接在 Staff 对象(或分别为 StaffType)中使用 validation_groups 来解决 $elemento应该是 Email elemento 一次和 Telephono elemento 一次...
针对您的情况的解决方案是将电子邮件和电话定义为不同的类(不是从 AbstractElementoContact 继承的),并为它们分别设置特定的约束。
我有几个实体,它们以单一形式使用,从抽象 class 扩展而来。 我为每个实体创建了一个表单类型,然后将它们嵌入到父表单中。
我想根据组执行验证,因此 EmailType 必须检查 "elemento" 属性 仅在 Assert\NotBlank(默认组)和 Assert\Email(电子邮件组),Telefono 必须检查 Assert\NotBlank(默认组)和 Assert\Regex(phone 组)。
根据我的配置,执行了两个检查(约束),因此在电子邮件约束和正则表达式上检查了电子邮件,因此 phone 文件是...我哪里错了?
收集电子邮件和 phone 的工作人员实体已配置 Assert\Valid() 约束
这就是例子
家长表格
<?php
namespace App\Form\Staff;
class StaffType extends AbstractType {
public function configureOptions(OptionsResolver $resolver) {
$resolver->setDefaults(['data_class' => \Cowbell\Entity\Staff\Staff::class,
'validation_groups' => ['Default', 'email', 'phone']]);
}
/**
*
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options) {
// ... Other field of Staff Entity
->add('emails', CollectionType::class, ['label' => 'admin.emails',
'entry_type' => \App\Form\Contatto\CBEmailType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'empty_data' => null,
'translation_domain' => 'admin',
'validation_groups' => ['email']])
->add('telefoni', CollectionType::class, ['label' => 'admin.phones',
'entry_type' => \App\Form\Contatto\CBTelefonoType::class,
'entry_options' => ['label' => false],
'allow_add' => true,
'allow_delete' => true,
'empty_data' => null,
'translation_domain' => 'admin',
'validation_groups' => ['phone']]);
}
}
然后是 CBEmailType
<?php
namespace App\Form\Contatto;
class CBEmailType extends AbstractType{
/**
*
* @param OptionsResolver $resolver
*/
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => \App\Entity\Contatto\Email::class,
'validation_groups' => ['Default', 'email']]);;
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('elemento', EmailType::class, ['label' => 'admin.email',
'translation_domain' => 'admin'])
}
}
CBTelefonoType
<?php
namespace App\Form\Contatto;
class CBTelefonoType extends AbstractType{
/**
*
* @param OptionsResolver $resolver
*/
public function configureOptions( OptionsResolver $resolver)
{
$resolver->setDefaults(['data_class' => \Cowbell\Entity\Contatto\Telefono::class,
'validation_groups' => ['Default', 'phone']]);
}
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('elemento', TextType::class, ['label' => 'admin.phone',
'translation_domain' => 'admin'])
}
}
电子邮件和电话都扩展
<?php
namespace App\Entity\Contact;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
abstract class AbstractElementoContact {
/**
*
* @var string
*
* @ORM\Column(name="elemento", type="string", length=100, nullable=false)
* @Assert\NotBlank()
* @Assert\Email(strict=true, checkHost=true, checkMX=true, groups={"email"})
* @Assert\Regex("/[0-9]{6,50}/", groups={"phone"})
*/
protected $elemento;
AFAIK 你不能在 CollectionType
表单字段上设置 validation_groups
(分别你可以设置它,但它没有效果),所以整个表单,包括子集集合中的表单始终通过在整个父表单上设置的 validation_groups
进行验证。
validation_groups
的目的是为了不同的目的(例如,创建新的与编辑现有的)允许约束修改对象的属性,但不适用于您上面描述的内容。
考虑一下,如果可能的话,将您当前的电子邮件和电话作为 属性 直接在 Staff 对象(或分别为 StaffType)中使用 validation_groups 来解决 $elemento应该是 Email elemento 一次和 Telephono elemento 一次...
针对您的情况的解决方案是将电子邮件和电话定义为不同的类(不是从 AbstractElementoContact 继承的),并为它们分别设置特定的约束。