我有以下代码:
class User { /** * @Assert\Type(type="string") * @Assert\NotBlank() * @Assert\Email() * @Assert\Length(max=255) */ public $email; }
此对象由 API 调用填充。当验证发生并且属性填充数组值而不是字符串时,NotBlank、电子邮件和长度验证继续工作,我得到“UnexpectedTypeException”。
我希望验证系统只添加一个关于错误值类型的错误并停在那里。
我已经制作了自定义约束验证器
class ChainConstraintValidator extends ConstraintValidator { /** * {@inheritdoc} */ public function validate($value, Constraint $constraint) { if (!$constraint instanceof ChainConstraint) { throw new UnexpectedTypeException($constraint, __NAMESPACE__.'\All'); } $context = $this->context; $prevCount = $context->getViolations()->count(); $validator = $context->getValidator()->inContext($context); foreach ($constraint->constraints as $constraintStep) { $errors = $validator->validate($value, $constraintStep); if ($errors->getViolations()->count() > $prevCount) { break; } } } }
它有效,我是这样使用它的:
@ChainConstraint( @Assert\Type(type="string"), @Assert\NotBlank(), @Assert\Email(), @Assert\Length(max=255) )
我的项目中有很多这样的类。是否有更漂亮且需要更少代码的方法来实现这一目标?
最佳答案
这个呢:
$var = [];
$constraints = [
new Type(['type'=>'string', 'groups'=> 'first-check']),
new NotBlank(['groups'=> 'second-check']),
new Email(['groups'=> 'second-check']),
new Length(['min'=>2, 'groups'=> 'second-check'])]
;
$groups = ['first-check', 'second-check'];
$groupSequence = new GroupSequence($groups);
$error = $validator->validate($var, $constraints, $groupSequence);
if(count($error) > 0) {
dd($error); // Contains 1 ConstraintViolation (Type)
}
关于php - 在 Symfony 中出现第一个错误时停止对象属性验证有多漂亮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53969319/