微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Symfony 验证 - 在自定义验证行为中设置属性路径

如何解决Symfony 验证 - 在自定义验证行为中设置属性路径

我想问一下,如何设置违反约束的属性路径。

到目前为止,我正在做一个正常的验证,比如(其中用户一个具有一些预定义约束的普通实体 - 这些约束作为切面工作):

$validationErrors = $this->validator->validate($user);

接下来,在用户注册控制器方法中,我尝试采用手动方法(因为将约束直接放在用户实体中会导致每次都对密码进行验证)

我会在需要时像这样验证密码:

$passwordLength = mb_strlen($password);
$passwordMinLength = new Assert\Length(null,8);
$passwordErrors = $this->validator->validate($passwordLength,[ $passwordMinLength ]);

之后,我将结果添加到现有集合中:

$validationErrors->addAll($passwordErrors);

但是当我检查密码生成的违规时,没有在其上定义 propertyPath。我构建了一个自定义树枝扩展,它依赖于正在设置的属性路径。我如何告诉它在 $passwordErrors 数组上使用名为“password”的 propertyPath?

我希望你能理解我的问题:)

最好的问候!

罗布

编辑: 我找到了适合我的工作解决方案。我敢肯定,这不是解决我的问题的最佳方式,但由于我已经在这件小事上浪费了几个小时,我决定选择解决方法,而不是在这件小事上花费更多时间。

我的解决方法 虽然我无法访问私有属性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

,

我刚刚发现如何修改现有的违规行为 而不是使用

$validationErrors->addAll($passwordErrors);

在您的自定义验证器中,使用此

/** @var ConstraintViolationInterface $violation */
foreach ($validationErrors as $violation) {
    $this->context->buildViolation($violation->getMessage())
        ->atPath('password')
        ->addViolation();
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。