php - 如何将实例传递给 symfony 表单验证器类?

标签 php symfony symfony4

我正在尝试创建自定义 symfony 表单验证器约束。我创建了两个类,一个约束和一个验证器,它工作正常。但我需要将原则实体管理器实例传递给验证器类,因为我独立使用它们而不是框架,所以我没有 yaml 配置文件。我在验证器类中创建了一个构造函数来包含 $em,并在 Controller 中创建了:

->add('email', EmailType::class, [                                              
    'constraints' => [
        new Assert\Email(['message' => 'invalid.email', 'mode' => 'strict', 'normalizer' => 'trim']),
        new Assert\EmailExists($em),
    ],
 ]);

但是在我的验证器类中我没有得到 $em,我该怎么办?我还尝试在主约束类中使用构造函数,然后在验证器中使用 parent::construct(),但仍然无法正常工作。

我也读过这篇文章How to configure dependencies on custom validator with Symfony Components?但我没有创建工厂类,而是使用了当前的因子类并使用了这个:

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

$container = new ContainerBuilder();
$container
    ->register('customEmailUniqueEntity', 'EmailExistsValidator')
    ->addArgument($em);
$validatorBuilder = Validation::createValidatorBuilder();
$validatorBuilder->setConstraintValidatorFactory(
    new ContainerConstraintValidatorFactory($container)
);

$validator = $validatorBuilder->getValidator();
$violations = $validator->validate('email address', [ 
    new EmailExists() 
]);

if (0 !== count($violations)) {
    // there are errors, now you can show them
    foreach ($violations as $violation) {
        echo $violation->getMessage().'<br>';
    }
}

使用此代码,依赖项注入(inject)和验证都可以正常工作,但是是否有技巧可以将此自定义约束作为表单生成器中的“约束”数组参数,而不是手动验证它?

->add('email', EmailType::class, [                                              
    'constraints' => [
        new Assert\Email(['message' => 'invalid.email', 'mode' => 'strict', 'normalizer' => 'trim']),
        new Assert\EmailExists($em),
    ],
 ]);

使用上面的代码,我无法将 $em 传递给我的自定义验证器的构造函数。有什么技巧可以吗?

编辑:

为了注入(inject)EntityManager,在EmailExists类中我有:

 public function validatedBy()
 {
        return 'customEmailUniqueEntity';
        //return \get_class($this).'Validator';
 }

然后我有:

$container = new ContainerBuilder();
$container
    ->register('customEmailUniqueEntity', 'EmailExistsValidator')
    ->addArgument($em);

因为如果我从 validatedBy() 返回验证器类,我无法将 $em 注入(inject)到验证器的构造函数中。我使用了下面的答案:

->addTag('validator.constraint_validator');

但是现在我收到 customEmailUniqueEntity class not find 错误,就好像我从 validatedBy() 返回验证器一样,注入(inject)不起作用,我该怎么办?我尝试返回

 public function validatedBy()
 {
        return 'EmailExists';
        //return \get_class($this).'Validator';
 }

但是这个,我当然收到了 initialize() 错误。请指教。

编辑2:

我将 addTag 添加到:

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

$container = new ContainerBuilder();
$container
    ->register('customEmailUniqueEntity', 'EmailExistsValidator')
    ->addArgument($em),
    ->addTag('validator.constraint_validator');

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

$validator = $validatorBuilder->getValidator();
$violations = $validator->validate('email address', [ 
    new EmailExists() 
]);

if (0 !== count($violations)) {
    // there are errors, now you can show them
    foreach ($violations as $violation) {
        echo $violation->getMessage().'<br>';
    }
}

在 EmailExistsValidator 的构造函数中我有:

var_dump($em);

并且我在验证器中获得了 $em 对象,因此注入(inject)了 $em 并且添加 addTag() 不会导致任何错误。如果我删除 EmailExists 约束的 validatedBy(),则不会完成注入(inject)。我正在用这种方法

return `customEmailUniqueEntity;`

因为如果我返回EmailExistsValidator,注入(inject)将不会完成。 现在如何使用 validator.constraint_validatorEmailExists() 作为表单的约束数组参数?如果我使用 new EmailExists() ,我将获得验证器类的两个参数,因为 $em 不会以这种方式注入(inject)。该怎么办?

最佳答案

约束不是验证器。 Symfony 将采用约束并通过将 Validator 附加到类名来搜索其验证器。
因此,在 symfony 中,您可以通过 EmailExists 注册约束,但实际进行验证的类/服务是 EmailExistsValidator
这也是注入(inject) EntityManagerInterface 的地方。

所有信息都可以在这里找到:Symfony - How to Create a custom Validation Constraint

关于php - 如何将实例传递给 symfony 表单验证器类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58417417/

相关文章:

PHP fatal error : Call to a member function bind_param() on a non-object

php - Twig - Symfony radio 扩展未正确呈现

symfony - 如何要求用户在自定义控制台命令中提供输入?

Symfony 3 或 4 自定义翻译加载器

Symfony 4,如何从服务类中正确获取根路径目录(或/src 路径)? (错误 : 'Call to a member function get() on null' )

PHP while 语句问题

php - 切换到MySQLi重要吗?

php - Symfony2 : setting a cookie

php - Symfony 4 - 使用服务加密/解密理论中使用的字段?

php - CakePHP:ACL 的误报 authError