【问题标题】:Validator with Doctrine dependency Injection in SymfonySymfony 中带有 Doctrine 依赖注入的验证器
【发布时间】:2014-05-05 13:42:53
【问题描述】:

我正在尝试验证注册表单中的“电子邮件”字段。我不想要重复的电子邮件。为此,我需要在我的自定义验证器中使用 Doctrine。我知道我必须将此依赖项定义为 DI 容器中的服务。

在阅读了一些文档后,我还不能。我现在有这个:

验证.yml

...
  properties:
    email:
      - NotBlank: ~
      - Email:    ~
      - Cgboard\SignupBundle\Validator\Constraints\EmailDoesntExist: ~
...

config.yml

services:
  validator.unique.EmailDoesntExist:
    class: Cgboard\SignupBundle\Validator\Constraints\EmailDoesntExistValidator
    tags:
      - { name: validator.constraint_validator, alias: EmailDoesntExistValidator }

EmailDoesntExistValidator.php

...
public function validate($value, Constraint $constraint)
{
    $em     = $this->get('doctrine')->getEntityManager(); // save our entity in DB
    $result = $em->getRepository('CgboardSignupBundle:User')->userExist($value);

    if (empty($result)) {
        return true;
    }

    $this->context->addViolation($constraint->message, array());
    return false;
}
...

我被困住了,任何事情都会对我有所帮助(例如互联网或其他)...谢谢!

【问题讨论】:

    标签: symfony


    【解决方案1】:

    尝试以这种方式注入EntityManager(在config.yml中):

    email_doesnt_exist_validator:
        class: Cgboard\SignupBundle\Validator\Constraints\EmailDoesntExistValidator
        arguments:
            - "@doctrine.orm.entity_manager"
    

    然后你必须将它设置为类属性:

    class EmailDoesntExistValidator {
    
       private $em;
    
       public function __construct(EntityManager $em) { // i guess it's EntityManager the type
           $this->em = $em;
       }
    
       // here you should be able to access the EntityManager
       public function validate($value, Constraint $constraint){
           $result = $this->em->getRepository('Cgboard\SignupBundle:User')->userExist($value);
    
           // ...
       }
    }
    

    我在这里写了代码,我希望它有效,无论如何这应该是正确的方法!

    【讨论】:

      【解决方案2】:

      您可以在 CookBook 上看到一个非常棒的示例:http://symfony.com/doc/current/cookbook/validation/custom_constraint.html

      你能告诉我们你的约束类吗?因为你需要一个来让它工作。 还有你的validator.yml,以确保你正确地引用了你的约束类。

      顺便说一句,你不需要在你的函数 validate() 中返回一些东西,如果值没有 addViolation,它会被认为是好的。

      【讨论】:

        【解决方案3】:

        我同意 ponciste 写的。默认情况下,您的验证器不是服务,因为您编写它。你将它定义为一项服务,就像 ponciste 写的那样,但请不要把它放在 config.yml 中。而是将它放在你的验证器类所在的包中的 services.yml 中。您可以通过这种方式注入 EntityManager,或者其他已经注入 Entity Manager 的服务。

        另一种方法,我相信更简单的方法是在validation.yml中:

        项目\捆绑\用户捆绑\实体\用户: 约束: - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: 字段:[电子邮件] 消息:'person.email.already_used'

        ...

        如果您有任何疑问或问题,请发表评论;)

        【讨论】:

          【解决方案4】:

          您应该使用 Symfony 提供的 UniqueEntity 约束 (http://symfony.com/doc/current/reference/constraints/UniqueEntity.html)。

          ...
              constraints:
                  - Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity: email
              properties:
                  email:
                      - NotBlank: ~
                      - Email: ~
          

          您是否需要更具体的约束,像您一样使用声明为服务的验证器,并将 Doctrine 实体管理器注入其中。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-04-30
            • 2014-08-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-01-05
            • 1970-01-01
            相关资源
            最近更新 更多