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:
Cree una interfaz en su paquete para la entidad
User
namespace Acme/UserBundle/Model; interface UserInterface { // public functions expected for entity User }
Haga que su entidad de
User
base implemente la interfaz.namespace Acme/UserBundle/Entity; /** * @ORM/Entity */ class User implements UserInterface { // implement public functions }
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; }
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
Extienda desde la clase de
User
o implementeUserInterface
namespace Acme/WebBundle/Entity; use Acme/UserBundle/Entity/User as BaseUser; /** * @ORM/Entity */ class User extends BaseUser { // Add new fields and functions }
Configurar el oyente en consecuencia
doctrine: # .... orm: # .... resolve_target_entities: Acme/UserBundle/Model/UserInterface: Acme/WebBundle/Entity/User