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

标签 symfony validation constraints

请问,如何在违反约束的情况下设置属性路径。

到目前为止,我正在做一个正常的验证,比如(用户是一个具有一些预定义约束的普通实体——它们按方面工作):

$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/

相关文章:

javascript - 如何通过 webpack 使用 videoJS 和 videoJS 播放列表以及 videoJS 播放列表 ui

php - Symfony2 & Doctrine : Create custom SQL-Query

ios - 在 Swift 中输入字段之前禁用按钮

forms - Cakephp 验证后,所有表单字段都为空,并出现表单错误

PHP - 使用 unicode 正则表达式的 XSD 模式验证错误

validation - 是否可以在 Grails 之外使用 Grails 验证?如何?

mysql - Doctrine2/Symfony2 - 每个包使用不同的数据库

ios - 在自动布局环境中移动 UIView

sql - 什么是数据库约束?

symfony - 使用 Symfony2 和 Swiftmailer,如何监听实际发送假脱机电子邮件时引发的异常?