具有依赖项的自定义验证程序

时间:2013-12-28 05:39:21

标签: php symfony service dependencies constraints

我尝试创建一个约束,检查数据库中是否存在电子邮件。

我在服务中有一个解决问题的方法。但是,我的问题是,如何对validateBy方法调用我的服务方法?

我正在阅读官方文档,但我不明白在示例中如何“挂钩”我的上下文:

services:
     validator.unique.your_validator_name:
     class: Fully\Qualified\Validator\Class\Name
     tags:
         - { name: validator.constraint_validator, alias: alias_name }

有什么想法吗?

1 个答案:

答案 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)