2016-06-28 85 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