【问题标题】:Symfony 3 validation groups inside child entity ignored子实体中的 Symfony 3 验证组被忽略
【发布时间】:2017-02-07 01:50:07
【问题描述】:

我有一个简单的表单,有两个字段,电子邮件和姓名。电子邮件在 Accounts 实体中,名称在子实体中:MedicalCenters

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Email;
use Symfony\Component\Validator\Constraints\NotBlank;

class AccountsMedicalCentersType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('email')
            ->add('name', TextType::class, array(
                'mapped' => false
            ));
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(
            array(
                'validation_groups' => array('emailValidation','Default')
                )
        );
    }
}

我想使用验证组验证字段,因为在 MedicalCenters 实体中我有一些其他验证,用于其他情况:

Accounts Entity,验证工作正常:

/**
     * @var string
     *
     * @ORM\Column(name="email", type="string", length=100, nullable=true, unique=true)
     * @Assert\NotBlank(groups={"emailValidation"})
     * @Assert\Email(groups={"emailValidation"})
     *
     */
    protected $email;
 /**
     * @var \MedicalCenters
     *
     * @ORM\ManyToOne(targetEntity="MedicalCenters")
     * @ORM\JoinColumns({
     *   @ORM\JoinColumn(name="medical_centers_id", referencedColumnName="id")
     * })
     *
     * @Assert\Valid
     *
     */
    private $medicalCenters;

MedicalCenters Entity,验证组被忽略,返回的错误是第二个(地址不为空):

/**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=300, nullable=true)
     * @Assert\NotBlank(message="name not blank", groups={"emailValidation"})
     *
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="address", type="text", length=65535, nullable=true)
     * @Assert\NotBlank(message="address not blank")
     */
    private $address;

我不明白为什么子实体不只验证属于组 emailValidation 的名称字段? 我做错了什么?

在我的控制器中:

$form = $this->createForm(
                AccountsMedicalCentersType::class,
                $currentAccount,
                array(
                    'validation_groups' => array(
                        'emailValidation',
                        'Default'
                    )
                )
            );

谢谢

【问题讨论】:

  • 您必须为email 创建一个子表单类型。然后启用'cascade_validation' => true,

标签: php forms symfony


【解决方案1】:

添加选项cascade_validation 可以解决问题,但该选项已被弃用。使用Valid 约束来验证子对象。来自 Symfony 文档:

此约束用于启用对作为被验证对象的属性嵌入的对象的验证。这允许您验证一个对象以及与之关联的所有子对象。 (来源:https://symfony.com/doc/current/reference/constraints/Valid.html

use Symfony\Component\Validator\Constraints\Valid;

class AccountsMedicalCentersType extends AbstractType
{
    ....

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('emailValidation','Default')
            'constraints' => array(
                new Valid()
            )
        ));
    }
}

【讨论】:

  • 这个帮助了我... 'constraints' => array( new Valid() ) 我们还需要包含“use Symfony\Component\Validator\Constraints\Valid;”在表单类型中
猜你喜欢
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多