2012-03-21 14 views
18

Deseo crear algunos paquetes Symfony2 que sean reutilizables en diferentes proyectos, pero donde las entidades también se puedan extender fácilmente si es necesario.Creación de paquetes portátiles con entidades ampliables en Symfony2

Un ejemplo podría ser un UserBundle reutilizable, que contiene una entidad de usuario con todas las asignaciones de ORM definidas. Sin embargo, en mi aplicación, es posible que desee extender esta entidad y agregar columnas adicionales, asociaciones o anular algunas de las asignaciones de los padres.

La solución más cercana que pude encontrar son las superclases mapeadas de Doctrine2, pero luego perdería el plug-and-playness de mi paquete reutilizable, siempre tendría que extender la superclase mapeada en mi aplicación incluso si no lo hago t desea modificar las asignaciones.

Los otros esquemas de herencia documentados requieren la modificación de las asignaciones de los padres, y entonces mi UserBundle ya no sería portátil en los proyectos.

¿Hay alguna manera de definir una entidad que funcione completamente en un paquete, y todavía ampliar eso en otro paquete?

+0

+1 Me han dibujado las mismas conclusiones que usted, ¿alguna vez llegar a una solución? – Steve

+0

No, parece que no es posible con los modelos de herencia actuales en Doctrine. – Gerry

+2

¿Alguna noticia sobre este problema? He estado luchando con esta limitación tantas veces que me pregunto si se emitirá una solución real. Bifurcar paquetes para agregar un campo en el mapeo de entidades se está haciendo viejo. –

Respuesta

11

Para referencia futura, esto se puede resolver usando target entity resolution.

Puede encontrar información adicional en Symfony docs.

Los pasos son bastante lisa y llana:

  1. crear una interfaz en su paquete para la entidad User

    namespace Acme/UserBundle/Model; 
    interface UserInterface 
    { 
        // public functions expected for entity User 
    } 
    
  2. Haga su base de User entidad implementar la interfaz

    namespace Acme/UserBundle/Entity; 
    /** 
    * @ORM\Entity 
    */ 
    class User implements UserInterface 
    { 
        // implement public functions 
    } 
    
  3. Crear relaciones como de costumbre, pero utilizando la interfaz

    namespace Acme/InvoiceBundle/Entity; 
    /** 
    * @ORM\Entity 
    */ 
    class Invoice 
    { 
        /** 
        * @ORM\ManyToOne(targetEntity="Acme\UserBundle\Model\UserInterface") 
        */ 
        protected $user; 
    } 
    
  4. configurar la escucha añadiendo lo siguiente a config.yml

    doctrine: 
        # .... 
        orm: 
         # .... 
         resolve_target_entities: 
          Acme\UserBundle\Model\UserInterface: Acme\UserBundle\Entity\User 
    

Si desea personalizar User entidad para su aplicación actual

  1. Extender de User clase o implementar UserInterface

    namespace Acme/WebBundle/Entity; 
    use Acme/UserBundle/Entity/User as BaseUser; 
    /** 
    * @ORM\Entity 
    */ 
    class User extends BaseUser 
    { 
        // Add new fields and functions 
    } 
    
  2. configurar la escucha en consecuencia

    doctrine: 
        # .... 
        orm: 
         # .... 
         resolve_target_entities: 
          Acme\UserBundle\Model\UserInterface: Acme\WebBundle\Entity\User 
    
Cuestiones relacionadas