symfony2 generate entitymanagerinterface consultas symfony doctrine2

symfony - generate - Doctrine Listener versus Subscriber



generate entity symfony (6)

Estoy trabajando en el marco de Symfony2 y me pregunto cuándo se usaría un suscriptor de Doctrine versus un oyente. La documentation de Doctrine para oyentes es muy clara, sin embargo, los suscriptores se pasan por alto. La entrada del libro de cocina de Symfony es similar.


Ambos le permiten ejecutar algo en un evento particular pre / post persistente, etc.

Sin embargo, los oyentes solo le permiten ejecutar comportamientos encapsulados dentro de su Entidad. Así que un ejemplo podría ser actualizar una marca de tiempo "date_edited".

Si necesita moverse fuera del contexto de su Entidad, necesitará un suscriptor. Un buen ejemplo podría ser llamar a una API externa, o si necesita utilizar / inspeccionar datos que no están directamente relacionados con su Entidad.


Debes usar el suscriptor de eventos cuando quieras tratar con múltiples eventos en una clase, por ejemplo en este artículo de la página de doc. Symfony2 , uno puede notar que el oyente de eventos solo puede administrar un evento, pero digamos que quieres tratar con varios eventos para uno entidad, prePersist, preUpdate, postPersist etc ... si usa el detector de eventos, debe codificar varios detectores de eventos, uno para cada evento, pero si va con el suscriptor de eventos, solo tiene que codificar una clase para el suscriptor del evento, mire eso con el suscriptor del evento puede administrar más de un evento en una clase, así es como lo uso, prefiero el código enfocado en lo que necesita el modelo de negocio, un ejemplo de esto puede ser que quiera manejar varios eventos del ciclo de vida global solo para un grupo de sus entidades, para hacer eso puede codificar una clase principal y definir esos métodos globales, luego hacer que sus entidades hereden esa clase y más tarde en el evento suscriptor suscribirse a cada evento que desee, prePersist, preUpdate, po stPersist, etc. ... y luego pregunta por esa clase de padres y ejecuta esos métodos globales.


Desde mi punto de vista, solo hay una diferencia importante:

  • El oyente está registrado especificando los eventos en los que escucha.
  • El suscriptor tiene un método que le dice al despachador qué eventos está escuchando

Puede que esto no parezca una gran diferencia, pero si lo piensas bien, hay algunos casos en los que deseas usar uno sobre el otro:

  • Puede asignar un oyente a muchos despachadores con diferentes eventos, ya que están configurados en el momento del registro. Solo necesita asegurarse de que todos los métodos estén en su lugar en el oyente
  • Puede cambiar los eventos en los que se registra un suscriptor durante el tiempo de ejecución e incluso después de registrar el suscriptor cambiando el valor de retorno de getSubscribedEvents (piense en un momento en el que escucha un evento muy ruidoso y solo desea ejecutar algo una vez)

¡Sin embargo, podría haber otras diferencias de las que no estoy enterado!


Esto es lo que el doctor está diciendo sobre eso en 4.1. Como esto se aplica globalmente a los eventos, supongo que también es válido para Doctrine (no está 100% seguro).

Oyentes o Suscriptores

Los oyentes y suscriptores se pueden usar indistintamente en la misma aplicación. La decisión de usar cualquiera de ellos es generalmente una cuestión de gusto personal. Sin embargo, hay algunas ventajas menores para cada uno de ellos:

  • Los suscriptores son más fáciles de reutilizar porque el conocimiento de los eventos se mantiene en la clase y no en la definición del servicio. Esta es la razón por la cual Symfony usa suscriptores internamente;
  • Los oyentes son más flexibles porque los paquetes pueden habilitar o deshabilitar cada uno de ellos condicionalmente, dependiendo de algún valor de configuración.

http://symfony.com/doc/master/event_dispatcher.html#listeners-or-subscribers


No sé si se hace accidental o intencionalmente. Pero los suscriptores tienen mayor prioridad que los oyentes: https://github.com/symfony/symfony/blob/master/src/Symfony/Bridge/Doctrine/DependencyInjection/CompilerPass/RegisterEventListenersAndSubscribersPass.php#L73-L98

Desde el punto de vista de la doctrina, no le importa qué es (oyente o suscriptor), con el tiempo ambos se registran como oyentes: https://github.com/doctrine/common/blob/master/lib/Doctrine/Common/EventManager.php#L137-L140

Esto es lo que vi.


Otra cosa importante: Doctrine EventSubscribers no le permite establecer una prioridad.

Lea más sobre este tema here