我正在尝试创建自定义 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_validator
或 EmailExists()
作为表单的约束数组参数?如果我使用 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/