2016-06-28 55 views
0

我想为我的用户注册过程使用两个Doctrine实体:UserMailaddress(我保持独立)。用户应该能够使用他们的用户名(来自表User)或他们的电子邮件地址(来自表Mailaddress)登录。跨相关实体的Symfony2验证

可惜我不能禁止在用户名@符号 - 这导致了下面的问题:如果一个用户注册2次 ...:

  1. 使用用户名“无所谓”和邮件“不@ unique.com”
  2. 用户名 “[email protected]和邮件 “[email protected]

...我将结束与两个用户是不能一世通过其各自的用户名或电子邮件地址进行识别。所以我需要一些验证!

现在我有2类(几乎完成)验证。

User(引用Mailaddress):

<?php 

//... 
use AppBundle\Entity\Mailaddress; 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Table(name="user", uniqueConstraints={@ORM\UniqueConstraint(name="unique_username", columns={"username"}), @ORM\UniqueConstraint(name="user2mail", columns={"fk_mail"})}) 
* @ORM\Entity(repositoryClass="AppBundle\Entity\Repository\UserRepository") 
* @UniqueEntity(
* fields={"username"}) 
*/ 
class User 
{ 
    /** 
    * @Assert\NotBlank(...) 
    * @Assert\Length(...) 
    * @Assert\Regex(...) 
    * 
    * @ORM\Column(name="username", type="string", length=100, nullable=false, unique=true) 
    */ 
    private $username; 

    //... 

    /** 
    * @var Mailaddress 
    * 
    * @Assert\Valid() 
    * 
    * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Mailaddress", cascade={"persist"}) 
    * @ORM\JoinColumn(name="fk_mail", referencedColumnName="id", nullable=false) 
    */ 
    private $obj_mail; 

    // ... 
} 

和类Mailaddress

<?php 

//... 
use Symfony\Component\Validator\Constraints as Assert; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Table(name="mailaddress", uniqueConstraints={@ORM\UniqueConstraint(name="uniqueEmail", columns={"email"})}) 
* @ORM\Entity 
* @UniqueEntity(
*  fields={"email"}) 
*/ 
class Mailaddress 
{ 
    /** 
    * @Assert\NotBlank(...) 
    * @Assert\Email(...) 
    * @Assert\Length(...) 
    * 
    * @ORM\Column(name="email", type="string", length=100, nullable=false, unique=true) 
    */ 
    private $email; 

    // ... 
} 

所有验证工作,主要是检查唯一(没有重复的用户名和电子邮件地址)。

但我怎么能验证

  1. 给定的电子邮件地址不存在的用户名?
  2. 给定的用户名不存在作为电子邮件地址?

回答

1

我想你想自定义的约束: https://symfony.com/doc/current/cookbook/validation/custom_constraint.html

当你定义它,你将不得不作出数据库调用,所以你必须将它传递DoctrineManager或一个EntityManager如果更具体(例如参数:['@doctrine']定义您的服务时)

+0

Thanx,解决了它!我之前检查过回调约束,他们显然没有工作。自定义约束,用作注入实体管理器(或注入的存储库作为服务)的服务。 – Eddie