如何使用Symfony组件配置对自定义验证器的依赖关系?

考特尼·迈尔斯(Courtney Miles)

我在项目中使用的是Symfony验证程序Symfony服务容器,但没有使用完整的Symfony框架。

我编写了一个自定义验证器,该验证器需要一些依赖项作为构造函数参数提供。

Symfony的文档描述了如何配置验证的服务,这是我已经成功完成的方法。但随后便可以使用validator.constraint_validator service标签了,我怀疑这是将它们粘合在一起的。

该服务标签似乎特定于使用完整的Symfony Framework时-当我添加此标签时,Symfony Validator不会神奇地加载我的自定义验证器(毫不奇怪)。

那么,如何链接验证器和服务容器组件?还是有其他让Symfony Validator为我的客户验证器加载依赖项的策略?

帖木儿

没错,这个标记(validator.constraint_validator)是由编译器传递处理的Symfony/FrameworkBundle如果您不想使用此捆绑包,但想将DI容器与验证器链接,则应重新实现此过程。

首先,我们需要一个ConstraintValidatorFactoryInterface实例。默认实现只是寻找一个类,其名称由约束的validatedBy()返回。从FrameworkBundle实施时,将validatedBy()的结果视为服务标识符/标签别名,并从容器中获取此服务。我们的实现应执行以下操作:

use Symfony\Component\DependencyInjection\ContainerInterface;

use Symfony\Component\Validator\ConstraintValidatorFactoryInterface;
use Symfony\Component\Validator\Constraint;

class ContainerConstraintValidatorFactory implements ConstraintValidatorFactoryInterface
{
    private $container;

    public function __construct(ContainerInterface $container)
    {
        $this->container = $container;
    }

    public function getInstance(Constraint $constraint)
    {
        // Simplified implementation, just for example:
        return $this->container->get($constraint->validatedBy());
    }
}

例如,假设我们有一些自定义验证约束和带有某些依赖项的验证器类:

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class CustomConstraint extends Constraint
{
    public $message = 'Oops!';

    public function validatedBy()
    {
        return 'validator.custom';
    }
}

class CustomConstraintValidator extends ConstraintValidator
{
    private $dependency;

    public function __construct($dependency)
    {
        $this->dependency = $dependency;
    }

    public function validate($value, Constraint $constraint)
    {
        if (rand() % 2 === 0) {
            $this->context
                ->buildViolation($constraint->message)
                ->addViolation();
        }
    }
}

接下来,我们将约束验证器作为服务注册,其ID与validatedBy()来自相关约束对象方法的结果相同我们通过该工厂创建与容器相关的验证器服务的实例。以相同方式注册的所有约束验证器将可用。

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\Validator\Validation;

$container = new ContainerBuilder();
$container->register(
    'validator.custom', 
    new CustomConstraintValidator('Some dependency value')
);

$validatorBuilder = Validation::createValidatorBuilder();
$validatorBuilder->setConstraintValidatorFactory(
    new ContainerConstraintValidatorFactory($container)
);
$validator = $validatorBuilder->getValidator();

$violations = $validator->validate('test value', [ 
    new CustomConstraint() 
]);

它可以工作,但是我建议考虑FrameworkBundle不要重新发明轮子。您可以将其配置为仅使用所需的东西。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何解决 JSR-303 自定义验证器中的依赖关系

如何设置/使用自定义验证器语法

如何使用 Laravel 自定义消息验证器

如何编写依赖于Angular2中当前组件的属性值的自定义表单验证器(由模型驱动)

如何解决自定义RubyGem的依赖关系?

Angular Ractive Forms:从自定义组件获取验证器

如何在自定义验证器中获取组件变量?

在自定义组件内的NgbDatePicker,如何传播验证器和样式?

Angular 4:在自定义验证器函数中使用组件变量

如何编写自定义函数来验证关系表

如何在django auth密码验证器旁边使用自定义密码验证器?

如何使用自定义验证器服务器验证列表中的每个条目

如何在没有依赖注入的情况下使用自定义 FormRequest 验证请求

如何为Kendo网格编辑器配置自定义验证规则

在symfony表单类型中使用自定义约束/验证器

Symfony 3.3 无法使用自定义验证器保存更新

如何在组件中使用自定义验证访问表单?

如何在智能表单组件中使用 react-hook-form 验证自定义输入?

ule子:如何配置自定义组件工厂?

使用自定义验证器进行Spring Bean验证

如何使用自定义远程验证器验证MVC中列表中不同的字段对?

如何验证属性/自定义配置文件?

如何通过Symfony 3身份验证使用自定义用户提供程序

自定义验证属性的依赖注入

使用joi进行自定义配置模块验证

通过扩展WebSecurityConfigurerAdapter,如何使用自定义身份验证逻辑构造配置

Symfony:如何从文件加载自定义捆绑包配置?

在Azure B2C自定义策略中,如何针对依赖于验证技术配置文件的验证显示2条以上的不同验证消息?

Symfony + FOSRestBundle - 如何为使用自定义表单类型配置的字段允许 NULL 值?