繁体   English   中英

子实体中的 Symfony 3 验证组被忽略

[英]Symfony 3 validation groups inside child entity ignored

我有一个简单的表单,有两个字段,电子邮件和姓名。 电子邮件在 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 实体中,我有一些其他验证,适用于其他情况:

帐户实体,验证工作正常:

/**
     * @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 实体,验证组被忽略,返回的错误是第二个(地址不为空):

/**
     * @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 组的 name 字段? 我究竟做错了什么?

在控制器中,我有:

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

谢谢

添加选项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()
            )
        ));
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM