for inheritance symfony doctrine-orm

inheritance - for - Creando paquetes portátiles con entidades extensibles en Symfony2



twig strict mode (1)

Quiero crear algunos paquetes de Symfony2 que son reutilizables en diferentes proyectos, pero donde las entidades también pueden extenderse fácilmente si es necesario.

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 ampliar 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 asignadas de Doctrine2, pero luego perdería el plug-and-playness de mi paquete reutilizable, siempre tendría que extender la superclase asignada en mi aplicación, incluso si no deseo modificar los mapeos.

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

¿Hay una manera de definir una entidad completamente operativa en un paquete, y aún así extenderla en otro paquete?


Para futuras referencias, esto se puede resolver utilizando la resolución de la entidad objetivo .

Puedes encontrar información extra en los documentos de Symfony .

Los pasos son bastante directos:

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

    namespace Acme/UserBundle/Model; interface UserInterface { // public functions expected for entity User }

  2. Haga que su entidad de User base implemente la interfaz.

    namespace Acme/UserBundle/Entity; /** * @ORM/Entity */ class User implements UserInterface { // implement public functions }

  3. Crea relaciones como siempre, pero usando la interfaz.

    namespace Acme/InvoiceBundle/Entity; /** * @ORM/Entity */ class Invoice { /** * @ORM/ManyToOne(targetEntity="Acme/UserBundle/Model/UserInterface") */ protected $user; }

  4. Configure el oyente agregando lo siguiente a config.yml

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

Si desea personalizar User entidad de User para su aplicación actual

  1. Extienda desde la clase de User o implemente 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 el oyente en consecuencia

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