2011-05-23 11 views
7

Estoy buscando una manera adecuada de reducir el acoplamiento en un paquete de mensajes Estoy escribiendo para el marco Symfony2, para que pueda usarlo fácilmente entre las aplicaciones.Reducir el acoplamiento en las entidades

Cada instancia de la entidad Mensaje debe tener un remitente y un destinatario, instanceof Symfony\Component\Security\Core\User\UserInterface, que puedo exigir muy bien en los ajustadores de las propiedades. Sin embargo, al configurar las relaciones ORM, parece que tengo que establecer específicamente un targetEntity (Foo\BarBundle\Entity\User, por ejemplo), lo que significa que todos los usos posteriores de la entidad Message en diferentes aplicaciones requerirán un cambio de código, o calzador en ellos utilizando una entidad de usuario, que no me parece estar en el alcance de un paquete de mensajes para requerir.

Alguna sugerencia/mejores prácticas sobre cómo puedo reducir el acoplamiento en esta instancia?

EDIT: Intenté fijar un parámetro global con una extensión y el uso que en las anotaciones, algo así como @ORM\ManyToOne(targetEntity="%my.entity%"), pero parece que el analizador de anotaciones no convierte parámetros, ya que la cadena se interpreta como un literal, que falló, por supuesto.

Respuesta

4

La solución en la que finalmente me decidí fue crear una MessengerIdentity, almacenada en la base de datos, que toma un objeto y almacena su nombre de clase e identificador. Luego usé un LifecycleEvent para cargar una referencia a la entidad almacenada en MessengerIdentity, por lo que algo como $messenger->getSender()->getUsername todavía es posible.

Usted puede ver mi aplicación on github (en particular, la entities y la Doctrine event listener) ... se puede ver también la discusión del grupo de usuarios Doctrine2 here.

EDIT: Después de mayor deliberación, decidí que no me gusta la aplicación hablo de más arriba (por un lado, que estaba esencialmente copiar y pegar el código en otros proyectos, que se sentía muy desordenado y en violación de DRY), así que rediseñé mi código para que la entidad Mensaje sea una superclase mapeada abstracta, con métodos abstractos que la lógica de negocios necesitará, haciendo referencia al remitente y al destinatario.

Ahora es hasta el desarrollador final para crear la implementación final de la entidad Mensaje, y la clase base ni siquiera toca las implementaciones para el remitente y el destinatario, que logró el resultado deseado de reducir la dependencia del paquete en una clase de usuario particular.

1

Puede crear un objeto Modelo con toda la lógica de negocio y luego crear una Entidad que amplíe el modelo pero agregue el código del administrador de entidades y las anotaciones de doctrina. Así es como funciona FOSUserBundle.

Cuestiones relacionadas