请问,如何在违反约束的情况下设置属性路径。
到目前为止,我正在做一个正常的验证,比如(用户是一个具有一些预定义约束的普通实体——它们按方面工作):
$validationErrors = $this->validator->validate($user);
接下来,在用户注册 Controller 方法中,我尝试采用手动方法(因为将约束直接放在用户实体内部会导致每次都对密码进行验证)
我在需要时验证密码,如下所示:
$passwordLength = mb_strlen($password);
$passwordMinLength = new Assert\Length(null, 8);
$passwordErrors = $this->validator->validate($passwordLength, [ $passwordMinLength ]);
然后,我将结果添加到现有集合中:
$validationErrors->addAll($passwordErrors);
但是当我检查密码生成的违规时,没有在其上定义 propertyPath。我构建了一个自定义的 Twig 扩展,它依赖于正在设置的属性路径。我如何告诉它使用 $passwordErrors
数组上名为“password”的 propertyPath?
我希望你能理解我的问题:)。
最好的问候!
罗布
编辑: 我找到了适合我的解决方法。我敢肯定,这不是解决我的问题的最佳方法,但由于我已经在这件小事上浪费了几个小时,所以我决定宁愿选择解决方法,而不是在这件小事上花费更多时间。
我的解决方案 虽然我无法访问私有(private)属性 propertyPath,但我想为每次违规设置 propertyPath,因此我通过以下方式解决了它:
首先我创建了一个闭包函数:
$closure = Closure::bind(function (ConstraintViolation $violation) {
$violation->propertyPath = 'password';
}, null, ConstraintViolation::class);
然后我为每次违规调用它:
foreach ($passwordErrors as $violation) {
// $violation->propertyPath = 'password';
$closure($violation);
}
最佳答案
如果我没理解错的话,你需要一个类约束验证器。
您需要将其添加到 Constraint 类中:
public function getTargets()
{
return self::CLASS_CONSTRAINT;
}
由此,验证器的 validate()
方法获取一个对象作为其第一个参数,并且 atPath()
方法用于定义验证错误的属性关联到。
class ProtocolClassValidator extends ConstraintValidator
{
public function validate($protocol, Constraint $constraint)
{
if ($protocol->getFoo() != $protocol->getBar()) {
$this->context->buildViolation($constraint->message)
->atPath('foo')
->addViolation();
}
}
}
文档:https://symfony.com/doc/current/validation/custom_constraint.html
关于Symfony 验证 - 在自定义验证行为中设置属性路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65544493/