【问题标题】:Symfony 2 unique validatorSymfony 2 唯一验证器
【发布时间】:2011-11-27 20:39:01
【问题描述】:

我正在尝试验证包含一些需要唯一字段的表单 - 用户名和电子邮件地址。如果我提交表单,我会收到数据库错误。我想像对其他所有事情一样使用验证器 - 现在我正在尝试在对象中使用自定义 getter 和 isvalidUsername 函数,但我不确定在对象中使用实体管理器是否是最好的方法.这是我目前正在使用的内容......

    Frontend\UserBundle\Entity\User:
         properties:
             email:
                  - NotBlank: ~
                  - Email: ~
         username:
             - NotBlank: ~
         getters:
              validUsername:
                   - "True": { message: "Duplicate User detected.  Please use a different username." }
              validEmail:
                   - "True": { message: "Duplicate email detected. Please use a different email." }

在 fosuserbundle 中有内置的唯一验证器,但我无法弄清楚如何使用它们。

【问题讨论】:

    标签: php forms validation symfony


    【解决方案1】:

    我知道这是一个老问题,但我刚刚解决了这个问题,所以我想我会分享我的解决方案。

    我不想使用任何捆绑包来处理我的用户,所以这是我的手动方法:

    <?php
    namespace MyCorp\CorpBundle\Entity;
    use Symfony\Component\Validator\Mapping\ClassMetadata;
    use Symfony\Component\Validator\Constraints\NotBlank;
    use Symfony\Component\Validator\Constraints\Email;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\User\AdvancedUserInterface;
    use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
    
    /** User - Represent a User object */
    class User implements AdvancedUserInterface {
    
        /** @var integer $id */
        private $id;
    
        /** @var string $email */
        private $email;
    
        /** Constructor, Getters, Setters etc... */
    
        /** Set a list of rules to use when validating an instance of this Class 
            @param Symfony\Component\Validator\Mapping\ClassMetadata $metadata */
        public static function loadValidatorMetadata(ClassMetadata $metadata) {
    
            $metadata->addPropertyConstraint('email', new MaxLength(255));
            $metadata->addPropertyConstraint('email', new NotBlank());
            $metadata->addPropertyConstraint('email', new Email());
    
            $metadata->addConstraint(new UniqueEntity(array(
                "fields" => "email", 
                "message" => "This email address is already in use")
            ));
    
        }
    
    }
    

    如您所见,我在模型本身中定义了我的验证。 Symfony 将调用 loadValidatorMetadata 让您加载验证器。

    【讨论】:

    • 这对我有用。也许在这种情况下使用 FOSUserBundle 会更好,但我只是想在某些东西上添加一个唯一性验证器,而不会立即搞砸所有这些,这就是诀窍。谢谢。
    • 我发现此解决方案似乎存在问题:如果您尝试更新现有用户记录,则会收到错误消息,指出电子邮件地址已在使用中,这当然不应该不会发生。
    • 这个解决方案对我有用,编辑和所有,所以我不确定发生了什么。我要到星期二才能检查我的代码,但我会看看能不能看到什么
    • 我意识到自从我说我会在星期二检查我的代码以来已经有几个月了,但迟到总比没有好。我刚刚检查过它,它在创建和编辑用户时按预期工作(Symfony 2.0.9,PHP 5.3.9)
    【解决方案2】:

    首先,我建议您使用FOSUserBundle。它非常灵活,您可以通过修复细微的错误和测试一切是否真的按预期工作来节省一些时间。

    无论如何,如果您真的想自己构建它,您至少可以从我上面提到的捆绑包中获得灵感。他们定义custom validator 并检查UserManager (validateUnique) 中的唯一性。此外,您必须将其注册为service 以通过构造函数注入提供UserManager。然后,您只需将其用作普通的class validator

    【讨论】:

      【解决方案3】:

      UniqueEntity 验证约束可确保用户为特定属性提供唯一值。

      有关使用 Symfony 支持的各种格式的示例,请参阅documentation。下面是一个使用注解的例子:

      // Acme/UserBundle/Entity/Author.php
      namespace Acme\UserBundle\Entity;
      
      use Symfony\Component\Validator\Constraints as Assert;
      use Doctrine\ORM\Mapping as ORM;
      
      // DON'T forget this use statement!!!
      use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
      
      /**
       * @ORM\Entity
       * @UniqueEntity("email")
       */
      class Author
      {
          /**
           * @var string $email
           *
           * @ORM\Column(name="email", type="string", length=255, unique=true)
           * @Assert\Email()
           */
          protected $email;
      
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-17
        • 1970-01-01
        • 2014-01-01
        • 1970-01-01
        • 2015-09-16
        • 1970-01-01
        相关资源
        最近更新 更多