我想使用@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和电子邮件验证,并且在违反约束的情况下会返回相应的错误。
答案 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');
},
));
}