2012-04-27 3 views
9

Ho seguito le istruzioni di questo tutorial: http://symfony.com/doc/current/cookbook/doctrine/event_listeners_subscribers.html e ho creato un semplice listener, che ascolta gli eventi inviati da Doctrine su inserimento o aggiornamento di un'entità. Gli eventi preInsert e postInsert funzionano correttamente e vengono inviati alla creazione di una nuova entità. Tuttavia, preUpdate e postUpdate non vengono mai richiamati nell'aggiornamento dell'entità, a prescindere da cosa. Lo stesso vale per onFlush. Come nota a margine, ho un controller generato da console che supporta le operazioni CRUD di base e l'ho lasciato intatto.eventi preUpdate e postUpdate non attivati ​​su Doctrine 2

Di seguito sono riportati alcuni snippet di codice per dimostrare il modo in cui sto facendo questo.

config.yml

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

Listener implementazione (ho omesso le altre funzioni e ha lasciato solo il postUpdate per scopi di semplicità)

class AnnotationListener 
{ 

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

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

L'ID entità non viene mai visualizzato, e lo script continua la sua esecuzione fino a quando non è completa, nonostante lo die alla fine della funzione.

risposta

13

Hai dimenticato di aggiungere @HasLifecycleCallbacks annotaion? È possibile utilizzare l'annotazione @PreUpdate e saltare del tutto la definizione del servizio.

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

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

A mio parere questo modo di collegare gli eventi è molto più facile in quanto non è necessario definire nuovi servizi e ascoltatori esplicitamente. Inoltre, hai accesso diretto ai dati che vengono aggiornati poiché questo metodo è un luogo all'interno della tua entità.

Ora, svantaggio è che si mescolano la logica con il modello e questo è qualcosa che dovrebbe essere evitato se possibile ...

Si può leggere di più su ciclo di vita callback qui: http://symfony.com/doc/master/cookbook/doctrine/file_uploads.html#using-lifecycle-callbacks

+2

vero ... Tuttavia , Devo usare altre entità e il gestore dell'entità stessa, e possibilmente altri servizi, quindi non sarebbe una buona idea. Ad ogni modo, sembra che il problema sia risolto ora. Ho aggiornato all'ultima versione di Symfony, ho svuotato la cache e tutto funziona. – tomor

+0

Ah sì, se stai usando altri servizi/entità ha senso non andare in questo modo :) –