Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Configurar Entity listeners de Doctrine en Symfony 2.6

11 de abril de 2015

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

#1

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

13 abril 2015, 8:57
#2

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

13 abril 2015, 17:13
#3

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

13 abril 2015, 23:36