我尝试创建一个约束,检查数据库中是否存在电子邮件。
我在服务中有一个解决问题的方法。但是,我的问题是,如何对validateBy方法调用我的服务方法?
我正在阅读官方文档,但我不明白在示例中如何“挂钩”我的上下文:
services:
validator.unique.your_validator_name:
class: Fully\Qualified\Validator\Class\Name
tags:
- { name: validator.constraint_validator, alias: alias_name }
有什么想法吗?
答案 0 :(得分:2)
为此,您需要在自定义验证器中注入服务,以便访问您要使用的方法。
就像下面的验证器添加服务引用一样简单,
use Symfony\Component\Validator\ConstraintValidator;
class EmailConstraintValidator extends ConstraintValidator
{
/*
* @var path_to_your_service/ServiceClass $yourService
*/
private $yourService;
public setYourService($instanceOfYourService)
{
$this->yourService = $instanceOfYourService;
}
}
然后,为了填充此引用,您应该在验证器服务定义中调用适当的setter(这也可以通过构造函数完成),
services:
validator.unique.your_validator_name:
class: Fully\Qualified\Validator\Class\Name
tags:
- { name: validator.constraint_validator, alias: alias_name }
calls:
- [setYourService, ["id_of_your_service"]]
这允许您在自定义验证器中使用您的服务,
public function validate($value, Constraint $constraint)
{
$this->yourService->theTargetedMethod(); // with the appropriate parameters
}
此外,由于您要检查数据库中是否存在给定的电子邮件,请记住Symfony提供了用于此目的的UniqueEntity constraint validator。文档包括a relevant example (related to unique email validation)。