2012-01-28 11 views
10

Estoy tratando de eliminar el índice único en emailCanonical, para que varios usuarios puedan compartir la misma dirección de correo electrónico. Sin embargo, no quiero editar FOS/UserBundle/Resources/config/doctrine/User.orm.xml directamente ya que cualquier actualización del paquete eliminará el cambio. ¿Hay alguna manera de anular el campo emailCanonical en mi propio paquete, mientras se extiende el usuario de base (FOS/UserBundle/modelo/User.php)FOSUserBundle: Eliminar índice único para 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; 
... 
} 

Gracias de antemano!

Respuesta

7

La única manera de hacerlo es ampliar la clase FOS\UserBundle\Model\User y luego volver a hacer todo el mapeo (todo en User.orm.xml) usted mismo.

Fuentes:

+1

Una mejor solución es del Tim respuesta – Arno

+0

Gracias @Arno - en el momento de la escritura (~ 2011), esta respuesta era correcto ya que '@ORM \ AttributeOverride' no existía. Cualquiera que se encuentre con esta pregunta ahora debería verificar [@ la respuesta de Tim] (https://stackoverflow.com/a/17059918/3765) a continuación. – leek

37

La respuesta que está marcado como en este momento (14 Oct 2014) no es la respuesta correcta en absoluto.

Ésta es la única solución correcta:

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

También se debe redefinir los grupos de validación para su formulario de usuario:

# 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 

¿Qué hemos hecho? Simplemente anulamos los grupos de validación para que no coincidan con las validaciones predeterminadas de FOS. En su lugar, su formulario será validado solo con el grupo Default. La validación descrita anteriormente UniqueEntity que no tiene ningún grupo se corresponderá con el grupo Default.

+0

Intenté esto, pero no funcionó para mí. –

+0

name = "email_canonical", ... name = "username_canonical" debería hacer el trabajo. – jrg

+0

Modifiqué la respuesta, agregué algunas explicaciones más. Y ahora funciona en todas las versiones de Symfony y FOSUserBundle que aún se mantienen. –

1

Suplemento a la respuesta de Tim, esta es la forma en que lo haría utilizando 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 
Cuestiones relacionadas