2012-01-28 11 views
10

Próbuję usunąć unikalny indeks na mailCanonical, aby wielu użytkowników mogło współużytkować ten sam adres e-mail. Jednak nie chcę edytować pliku FOS/UserBundle/Resources/config/doctrine/User.orm.xml bezpośrednio, ponieważ wszelkie aktualizacje pakietu same usuwają tę zmianę. Czy jest jakiś sposób mogę zmienić pole emailCanonical w moim zestawie, jednocześnie przedłużając użytkownikowi bazową (FOS/UserBundle/model/User.php)FOSUserBundle: Usuń unikatowy indeks dla wiadomości e-mailCanonical

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

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

Z góry dzięki!

Odpowiedz

7

Jedynym sposobem, aby to zrobić, jest rozszerzenie klasy FOS\UserBundle\Model\User, a następnie samodzielne wykonanie wszystkich map (wszystko w User.orm.xml).

Źródła:

+1

Lepszym rozwiązaniem jest Tima odpowiedź – Arno

+0

Dzięki @Arno - w momencie pisania (~ 2011), Ta odpowiedź było poprawne, ponieważ "@ORM \ AttributeOverride" nie istniało. Każdy, kto natknie się na to pytanie, powinien sprawdzić odpowiedź [@ Tim's answer] (https://stackoverflow.com/a/17059918/3765) poniżej. – leek

37

Odpowiedź, która jest oznaczona jako teraz (14 października 2014) nie jest właściwą odpowiedzią na wszystko.

To jedyne właściwe rozwiązanie:

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 
{ 
... 
} 

także trzeba zastąpić grupy walidacji formularza użytkownika:

# 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 

Co mamy robić? Przekroczyliśmy tylko grupy sprawdzania poprawności, aby nie odpowiadały domyślnym sprawdzeniom FOS. Zamiast tego Twój formularz zostanie zatwierdzony tylko z grupą Default. Opisana powyżej walidacja UniqueEntity, która nie ma żadnej grupy, zostanie dopasowana przez grupę Default.

+0

Próbowałem tego, ale to nie działało dla mnie. –

+0

name = "email_canonical", ... name = "username_canonical" powinno wykonać zadanie. – jrg

+0

Zmieniłem odpowiedź, dodałem kilka dodatkowych wyjaśnień. A teraz działa w każdej wersji Symfony i FOSUserBundle, które są jeszcze obsługiwane. –

1

Suplement do odpowiedzi Tima, to jak chcesz to zrobić za pomocą 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 
Powiązane problemy