2011-09-29 67 views
5

我想验证一些表单中需要唯一的字段 - 用户名和电子邮件地址。如果我提交表单,我会收到数据库错误。我想使用一个验证器,就像我做的一切 - 现在我试图在对象中使用自定义getters和isvalidUsername函数,并且我不确定在对象中使用实体管理器是否是实现此目的的最佳方法。继承人什么我与迄今的工作...Symfony 2独特的验证程序

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独特的验证,但我一直无法弄清楚如何使用它们。

回答

1

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

无论如何,如果你真的想自己构建它,至少可以通过上面提到的包来激发灵感。他们定义custom validator并检查UserManagervalidateUnique)中的唯一性。此外,您必须将其注册为service,以通过构造函数注入来提供UserManager。然后,您只需使用它作为正常的class validator

5

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

我不喜欢使用的任何软件包来处理我的用户,所以这是我的手动方法:

<?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让你加载验证器。

+0

这对我有用。也许在这种情况下使用FOSUserBundle会更好,但是我只想对某个东西拍一个唯一性验证器,而不会搞乱所有这些,而且这个技巧。谢谢。 –

+0

我发现这个解决方案似乎有什么问题:如果您尝试更新现有的用户记录,您会收到一个错误消息,说明电子邮件地址已被使用,当然这不应该发生。 –

+0

此解决方案正在为我工​​作,编辑和所有,所以我不知道发生了什么。我直到星期二才能检查我的代码,但我会看看我是否可以看到任何东西 – OrganicPanda

0

存在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; 

    // ... 
}