2012-01-20 4 views
10

Vorrei estendere le classi Entità \ Base, come farlo in Doctrine 2.1? La mia ricerca ha dimostrato che ogni volta che qualcuno incontra il problema nel fare ciò passa a Doctrine 1.2:) n sto usando la configurazione di yamlDottrina: estensione della classe di entità

+0

perché vuoi estenderlo? – jere

+0

Vorrei creare una nuova classe che estenda la base, qualcosa come Utente estende UserBase. Attualmente tutte le classi base sono in Entities/Base quindi vorrei creare nuove classi in Entities e estenderanno Entities/Base classes – mkk

+0

@jaro Vorrei seguire lo schema di Doctrine 1.2 che ho classi base e classi normali, Estendo le classi base per poter scrivere i miei metodi personalizzati. Il problema è che le classi base sono generate automaticamente e non voglio perdere codice ogni volta che cambio qualcosa nel modello. – mkk

risposta

16

Doctrine 2.X Le entità funzionano come POPO (Plain Old PHP Objects). Per ottenere un'estensione corretta, Doctrine impone l'utilizzo di un concetto di JPA denominato Super classi mappate. L'idea è piuttosto semplice. Ogni volta che vuoi avere una classe base e vuoi che le tue entità si estendano da essa (non sto parlando di ereditarietà a livello di DB), tutto ciò che devi fare è creare la tua classe Base come MappedSuperClass.

Ecco un esempio: http://www.doctrine-project.org/docs/orm/2.1/en/reference/inheritance-mapping.html#mapped-superclasses

Grazie

+0

Ho fatto qualcosa di simile, grazie per lo sforzo, anche se il problema è stato risolto un paio di giorni fa contrassegnerò la tua risposta come giusto comunque – mkk

+2

Potresti aver postato la soluzione, lo sai. L'intero scopo di questa comunità è di aiutarci a vicenda. –

+0

@NikolaPetkanski hai ragione al 100%, e puoi osservare che rispondo alla mia stessa domanda se trovo una soluzione. – mkk

2

Ecco la soluzione da collegamento Guilherme Blanco. Mi piace avere una soluzione pubblicata invece di un collegamento che alla fine non potrebbe più funzionare in futuro:

<?php 
/** @MappedSuperclass */ 
class MappedSuperclassBase 
{ 
    /** @Column(type="integer") */ 
    protected $mapped1; 

    /** @Column(type="string") */ 
    protected $mapped2; 

    /** 
    * @OneToOne(targetEntity="MappedSuperclassRelated1") 
    * @JoinColumn(name="related1_id", referencedColumnName="id") 
    */ 
    protected $mappedRelated1; 

    // ... more fields and methods 
} 

/** @Entity */ 
class EntitySubClass extends MappedSuperclassBase 
{ 
    /** @Id @Column(type="integer") */ 
    private $id; 

    /** @Column(type="string") */ 
    private $name; 

    // ... more fields and methods 
}