Symfony:选中复选框时验证字段

时间:2016-03-31 09:00:24

标签: symfony

我想使用@Assert \ NotBlank和@Assert \ Email验证电子邮件实体,只有选中复选框($ updateEmailCheckBox)。 因为现在这些断言是在电子邮件字段的注释中定义的,并且在未选中复选框时也会进行验证。

这是我的用户网站的片段:

 /**
 * Update email checkbox entity
 */
 private $updateEmailCheckBox;

 /**
 * @var string
 * @Assert\NotBlank(message="Email can't be empty")
 * @Assert\Email(message="Wrong email pattern")
 */
private $email;

/**
 * @Assert\Callback
 */
public function validate(ExecutionContextInterface $context)
{
    /**
     * If update email checkbox is checked
     */
    if ($this->getUpdateEmailCheckBox() == 1)
    {
        // how to validate here an email field for Assert\NotBlank and Assert\Email ?
    }
}

我可以使用回调检查是否选中了复选框,但我无法弄清楚如何启用NotBlank和电子邮件验证,并且在违反约束的情况下会返回相应的错误。

1 个答案:

答案 0 :(得分:2)

您可以使用validation groups

 /**
 * @Assert\NotBlank(groups={"updateEmail"})
 * @Assert\Email(groups={"updateEmail"})
 */
private $email;

当您想要在控制器或服务中验证您的用户时,您再次验证该组(如果选中复选框)。

$errors = $validator->validate($user, null, array('Default', 'updateEmail'));
  

默认:       包含当前类中的约束以及属于其他组的所有引用类。

如果您正在使用表单,则应将表单配置为使用验证组。像这样:

public function configureOptions(OptionsResolver $resolver)
{
   $resolver->setDefaults(array(
       'validation_groups' => function (FormInterface $form) {
           $data = $form->getData();


           if (/* checkbox is checked */) {
               return array('Default', 'updateEmail');
           }

           return array('Default');
    },
   ));
}