2012-01-28 12 views
10

Sto tentando di rimuovere l'indice univoco su emailCanonical, in modo che più utenti possano condividere lo stesso indirizzo email. Tuttavia, non desidero modificare FOS/UserBundle/Resources/config/doctrine/User.orm.xml direttamente poiché qualsiasi aggiornamento al bundle stesso rimuoverà la modifica. C'è un modo per ignorare il campo emailCanonical nel mio fagotto, mentre estendendo l'utente base (FOS/UserBundle/Modello/User.php)FOSUserBundle: rimuove l'indice univoco per 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; 
... 
} 

Grazie in anticipo!

risposta

7

L'unico modo per eseguire questa operazione è estendere la classe FOS\UserBundle\Model\User e quindi eseguire di nuovo tutta la mappatura (tutto in User.orm.xml).

Fonti:

+1

Una soluzione migliore è la Tim risposta – Arno

+0

Grazie @Arno - al momento della scrittura (~ 2011), questa risposta era corretto poiché '@ORM \ AttributeOverride' non esisteva. Chiunque incontri questa domanda ora dovrebbe verificare [risposta di Tim] (https://stackoverflow.com/a/17059918/3765) di seguito. – leek

37

La risposta che è contrassegnato come in questo momento (14 ottobre 2014) non è la risposta giusta a tutti.

Questa è l'unica soluzione giusta:

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

Inoltre è necessario eseguire l'override gruppi di validazione per il modulo utente:

# 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 

Che cosa abbiamo fatto? Abbiamo semplicemente annullato i gruppi di convalida per non corrispondere alle convalide di default FOS. Invece il tuo modulo sarà convalidato solo con il gruppo Default. Descritto sopra la convalida UniqueEntity a cui nessun gruppo sarà abbinato dal gruppo Default.

+0

Ho provato questo, ma non ha funzionato per me. –

+0

name = "email_canonical", ... name = "username_canonical" dovrebbe fare il lavoro. – jrg

+0

Ho modificato la risposta, aggiungo qualche altra spiegazione. E ora funziona in tutte le versioni di Symfony e FOSUserBundle che sono ancora mantenute. –

1

Supplemento alla risposta di Tim, questo è come si farebbe utilizzando 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 
Problemi correlati