2013-03-21 1 views
13

Ho un problema con l'override di un'entità. Ho bisogno che il campo emailCanonical non sia univoco.Symfony2 FOSUserBundle Override campo entità utente

Ecco quello che ho fatto: Nel mio UserBundle\Resources\config\doctrine\User.orm.xml ho aggiunto la seguente configurazione attribute-overrides, in base alla documentazione Doctrine2

<attribute-overrides> 
    <attribute-override name="emailCanonical"> 
     <field column="email_canonical" unique="false" name="emailCanonical" /> 
    </attribute-override> 
</attribute-overrides> 

Poi ho eseguito il seguente console comanda

$ php app/console doctrine:migrations:diff 
$ php app/console doctrine:migrations:migrate 

Tutto ha funzionato bene. emailCanonical è stato reso non unico. Ma ora, quando ho bisogno di generare un'entità in altri fasci di progetto, ho una strana errore:

$ php app/console doctrine:generate:entities SkyModelsBundle:Category 
Generating entity "Sky\Bundle\ModelsBundle\Entity\Category" 

[Doctrine\ORM\Mapping\MappingException] 
Invalid field override named 'emailCanonical' for class 'Sky\Bundle\UserBundle\Entity\User'. 

doctrine:generate:entities [--path="..."] [--no-backup] name 

Tuttavia, se tolgo le impostazioni di override dalla mappatura XML, tutto funziona bene.

+0

non sono sicuro, qual è la tua domanda. –

+0

Ecco come l'ho risolto .. puoi provare questo: http://stackoverflow.com/a/17059918/2342137 – Tim

+0

Ho lo stesso problema. Ho usato le annotazioni per sovrascrivere lo stesso attributo e non ho capito che c'era un problema fino a quando non ho provato a usare doctrine: generate: entity. Hai mai trovato una soluzione? – d0001

risposta

2

credo che l'attributo name del tag field non è necessario, dal momento che è già specificato per il tag attribute-override

Prova questa

<attribute-overrides> 
    <attribute-override name="emailCanonical"> 
     <field column="email_canonical" unique="false" /> 
    </attribute-override> 
</attribute-overrides> 
1

Sembra che le entità FOSUserBundle non vengono importati correttamente in il tuo progetto. Assicurarsi FOSUserBundle è presente nella sezione "mappature" (ramo "dottrina") della vostra config.yml

doctrine: 
    orm: 
     entity_managers: 
      default: 
       connection:  default 
       mappings: 
        AcmeDemoBundle: ~ 
        FOSUserBundle: ~ 
3

Citazione di ufficiale documentation, quindi può essere il suo l'unico modo.

If you need to change the mapping (for instance to adapt the field names to a legacy database), the only solution is to write the whole mapping again without inheriting the mapping from the mapped superclass.

+0

oh dio o.O ..... – Kuro

+6

Si dice anche "Un'altra soluzione può essere eseguita tramite attributo di attributo e sostituzioni di relazioni" – httpete

+0

Non così vero da giugno 2013 .. è possibile sovrascrivere solo i mapping e comunque ereditare da BaseUser. Come descritto qui: http://stackoverflow.com/questions/22718628/fosuserbundle-override-roles-property-roles-in-acme-demobundle-entity-user/24612877#24612877 – juanmf

0

Ho ricevuto lo stesso bug proprio ora e l'ho risolto. Doctrine lancia questa eccezione Mapping in ClassMetadataInfo quando non riesce a trovare la relativa proprietà (attributo o relazione) nella sua mappatura.

Così, al fine di ignorare attributo "emailCanonical", è necessario utilizzare "attributo-override" e "attributo-override" (come avete fatto), e ridefinire proprietà di classe php nel vostro soggetto:

<?php 
... 
class YourUser extends BaseUser 
{ 
    ... 
    /** 
    * Email canonical 
    * 
    * @var string 
    * 
    * @ORM\Column(name="email_canonical", type="string", length=255, unique=false) 
    */ 
    protected $emailCanonical; 

@EDIT: l'utilizzo di questa soluzione mi provoca un altro bug.

Ha risolto il problema "Campo non valido sovrascrive nome ...", ma ne ho trovato un altro con "Duplica definizione di colonna ..." quando si tenta di convalidare lo schema con il comando php app/console doctrine:schema:validate.

Qualche idea?

+0

Hai trovato una soluzione? – httpete

+0

Non ho trovato altre soluzioni oltre a quelle spiegate sopra:/Sono sempre alla ricerca di una soluzione "pulita" per questi bug – vince

0

La classe che si estende BaseUser dovrebbe essere come questo:

<?php 
namespace Namespace\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use FOS\UserBundle\Model\User as BaseUser; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 
/** 
* User 
* @ORM\Entity 
* @ORM\Table(name="user") 
* @UniqueEntity(fields="email", message="your costum error message") 
* 
*/ 
class myUser extends BaseUser 
{ 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
} 

?> 
10

Si modifichi utilizzando le annotazioni di PHP in questo modo (Questo è supportato a partire dalla dottrina versione 2.3 e superiori, si ricorda che nella documentazione si parla che si non è possibile sovrascrivere i tipi, tuttavia sono stato in grado di farlo utilizzando l'ultima versione di doctrine, al momento della scrittura è 2.4.4):

<?php 
namespace Namespace\UserBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 
use FOS\UserBundle\Model\User as BaseUser; 

/** 
* User 
* @ORM\Entity 
* @ORM\AttributeOverrides({ 
*  @ORM\AttributeOverride(name="id", 
*   [email protected]\Column(
*    name  = "guest_id", 
*    type  = "integer", 
*    length = 140 
*   ) 
*  ) 
* }) 
*/ 
class myUser extends BaseUser 
{ 
    /** 
    * @ORM\Id() 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 
} 

Questo è specificato nella documentazione a: http://docs.doctrine-project.org/projects/doctrine-orm/en/latest/reference/inheritance-mapping.html#overrides

+1

Questa è la risposta corretta per me. – Hast

0

So che questo è un vecchio post, ma ho trovato una soluzione, almeno ha funzionato per me, forse sarebbe utile per qualcun altro.

Bene, ho avuto lo stesso problema e sto usando un gestore personalizzato per fos_user, nel file di dichiarazione config.yml sotto doctrine gestore_destinazione entity_manager ho dichiarato il mapping a FOS_userBundle, ma ciò che mancava è dire a FOS_user che usiamo un manager differente e questo è con l'aggiunta di:

fos_user:
---- db_driver: orm
---- model_manager_name: MyCustom_Manager