2012-04-27 9 views
9

He seguido las instrucciones de este tutorial: http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html, y he creado un escucha simple, que escucha los eventos enviados por Doctrine al insertar o actualizar una entidad. Los eventos preInsert y postInsert funcionan bien y se envían en la creación de una nueva entidad. Sin embargo, preUpdate y postUpdate nunca se invocan en la actualización de la entidad pase lo que pase. Lo mismo ocurre con onFlush. Como nota al margen, tengo un controlador generado por consola que admite las operaciones CRUD básicas, y lo he dejado intacto.eventos preUpdate y postUpdate no activados en Doctrine 2

A continuación se muestran algunos fragmentos de código para demostrar la forma en que lo estoy haciendo.

config.yml

annotation.listener: 
    class: City\AnnotatorBundle\Listener\AnnotationListener 
    tags: 
     - { name: doctrine.event_listener, event: postUpdate} 

implementación del receptor (He omitido las otras funciones y se fue sólo el PostUpdate por simplicidad)

class AnnotationListener 
{ 

    public function postUpdate(LifecycleEventArgs $args) 
    { 
     $entity=$args->getEntity(); 

     echo $entity->getId(); 
     die; 
    } 
} 

El ID de entidad nunca se muestra, y el guión continúa su ejecución hasta que esté completa, a pesar del muere al final de la función.

Respuesta

13

¿Olvidaste agregar @HasLifecycleCallbacks annotaion? Puede usar la anotación @PreUpdate y omitir la definición del servicio por completo.

/** 
* @ORM\Entity 
* @ORM\HasLifecycleCallbacks 
*/ 
class YouEntity 
{ 

    /** 
    * @ORM\PrePersist() 
    * @ORM\PreUpdate() 
    */ 
    public function preUpdate(){ 
     // .... your pre-update logic here 
    } 
    .... 
} 

En mi opinión esta manera de unir eventos es mucho más fácil, ya que no tiene que definir nuevos servicios y oyentes explícitamente. También tiene acceso directo a los datos que se actualizan, ya que este método es ubicaciones dentro de su entidad.

Ahora, inconveniente es que se mezcla la lógica con su modelo y eso es algo que debe ser evitado si es posible ...

Puede leer más acerca del ciclo de vida devoluciones de llamada aquí: http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

cierto ... Sin embargo , Tengo que usar otras entidades y el propio administrador de la entidad, y posiblemente otros servicios, por lo que no sería una buena idea. De todos modos, parece que el problema se resuelve ahora. Actualicé a la última versión de Symfony, borré el caché y todo está funcionando. – tomor

+0

Ah, sí, si está utilizando otros servicios/entidades, tiene sentido no ir por este camino :) –