Hola.
En este momento necesito crear un listener para los eventos de Doctrine, tales como postPersist
, preUpdate
, etc.
Buscando en el cookbook de Symfony encontré esto: How to Register Event Listeners and Subscribers
En esa guía mencionan que una nueva característica de Doctrine permite asignar un listener por entidad, esto me parece mejor ya que se mantiene el código separado, más ordenado.
Cree la clase listener y en la entidad especifiqué (según el ejemplo),
@EntityListeners({"UserListener"})
La clase UserListener
tiene un método postPersist
donde implemento mi lógica. Pero cuando agrego un nuevo registro no pasa nada, no se ejecuta ese código. Y la cuestión es que tal vez o muy seguramente Doctrine no ejecuta la clase listener por si solo.
¿Qué debo hacer para que esto funcione? ¿Cómo debo configurar mi listener?
Gracias.
Respuestas
Según nos comentas, has creado la clase y has puesto el @EntityListeners()
en la entidad de Doctrine. Si no has hecho nada más, entonces el error es que te falta definir un servicio para el nuevo listener. Algo así:
# app/config/services.yml services: doctrine.user_listener: class: AppBundle\EventListener\UserListener tags: - { name: doctrine.event_listener, event: postPersist }
@javiereguiluz
Hola @javierequiluz, gracias por la respuesta.
Si hago lo que mencionas, tendría que hacer lo siguiente en el Listener:
// perhaps you only want to act on some "Product" entity if ($entity instanceof Product) { // ... do something with the Product }
De esa manera poner el @EntityListeners()
en la entidad no serviria de nada.
Lo que entiendo y corrigeme si estoy equivocado, es que la anotacion @EntityListeners()
es como cuando indicas una clase repositorio. Esa clase se encarga de los eventos para esa entidad sin mas ni mas, segun la doc:
In Doctrine 2.4, a feature called Entity Listeners was introduced. It is a lifecycle listener class used for an entity.
No si me expliqué bien.
Al hacer el servicio como lo mencionas, y configurar la clase listener con la condición, el evento funciona perfectamente, pero imagina que en 10 entidades necesitas usar el evento postPersist
, el codigo se volveria muy extenso.
Gracias.
@ramiroanacona
Hola, la manera como indica Doctrine si funciona, la razón por la que no funciona en mi proyecto era porque está configurada esta cache de Doctrine
Gracias.
@ramiroanacona