2012-01-28 59 views
10

我試圖刪除emailCanonical上的唯一索引,以便多個用戶可以共享相同的電子郵件地址。但是,我不想直接編輯FOS/UserBundle/Resources/config/doctrine/User.orm.xml,因爲對該軟件包的任何更新都會刪除該更改。有沒有什麼辦法可以覆蓋在我自己的包中emailCanonical領域,同時延長了基本用戶(FOS/UserBundle /型號/ user.php的)FOSUserBundle:刪除emailCanonical的唯一索引

use FOS\UserBundle\Entity\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 
use Foo\BarBundle\Constant\SecurityConstant; 

class User extends BaseUser { 
    protected $id; 
... 
} 

提前感謝!

回答

7

要做到這一點的唯一方法是擴展FOS\UserBundle\Model\User類,然後自己重​​新執行所有映射(在User.orm.xml中的所有內容)。

來源:

+1

一個更好的解決方案是蒂姆的答案 – Arno 2017-07-31 14:25:46

+0

感謝@Arno - 在寫這篇文章時(〜2011),這個答案由於@ORM \ AttributeOverride不存在,所以是正確的。現在遇到這個問題的任何人現在都應該查看下面的[@ Tim's answer](https://stackoverflow.com/a/17059918/3765)。 – leek 2017-08-17 21:51:36

37

被作爲權標,現在(2014年10月14日),答案是不正確的答案的。

這是唯一正確的解決方案:

namespace XXX\UserBundle\Entity; 

use FOS\UserBundle\Model\User as BaseUser; 
use Doctrine\ORM\Mapping as ORM; 
use Doctrine\Common\Collections\Collection; 
use Doctrine\Common\Collections\ArrayCollection; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* @ORM\Entity 
* @ORM\Table(name="User_User") 
* @ORM\Entity(repositoryClass="UserRepository") 
* @UniqueEntity(fields="usernameCanonical", errorPath="username", message="fos_user.username.already_used") 
* @ORM\AttributeOverrides({ 
*  @ORM\AttributeOverride(name="email", [email protected]\Column(type="string", name="email", length=255, unique=false, nullable=true)), 
*  @ORM\AttributeOverride(name="emailCanonical", [email protected]\Column(type="string", name="email_canonical", length=255, unique=false, nullable=true)) 
* }) 
*/ 
class User extends BaseUser 
{ 
... 
} 

而且你需要重寫確認團組的用戶表單:

# app/config/config.yml 
... 
fos_user: 
profile: 
    form: 
     validation_groups: [Default] # Here you can also add your own groups if you have extra validation 
registration: 
    form: 
     validation_groups: [Default] # Here you can also add your own groups if you have extra validation 

我們做了什麼?我們只是覆蓋驗證組,使其與FOS默認驗證不匹配。相反,您的表單將僅通過Default組驗證。上面描述的驗證UniqueEntity表示沒有任何組將與Default組匹配。

+0

試過這個,但它不適合我。 – 2013-10-25 06:25:09

+0

name =「email_canonical」,... name =「username_canonical」應該完成這項工作。 – jrg 2014-06-24 10:53:14

+0

我修改了答案,添加了更多解釋。現在它可以在任何版本的Symfony和FOSUserBundle中運行,但仍然保留。 – 2014-10-14 04:54:27

1

補充添的回答,這是你將怎樣使用YAML做到這一點:

My\UserBundle\Entity\User: 
    type: entity 
    table: null 
    repositoryClass: My\UserBundle\Entity\UserRepository 
    attributeOverride: 
     usernameCanonical: 
     unique: false 
     name: usernameCanonical 
     column: username_canonical 
     length: 255 
     nullable: false 
     type: string 
     emailCanonical: 
     unique: false 
     name: emailCanonical 
     column: email_canonical 
     length: 255 
     nullable: false 
     type: string 
    fields: 
     id: 
      type: integer 
      id: true 
      generator: 
       strategy: AUTO 
     firstName: 
      type: string 
      length: 255