2011-10-28 26 views
15

All'interno della stessa entità ho un PreUpdate e un PrePersist. Il PreUpdate si attiva, ma PrePersist non lo fa mai. Inserisco uno die() dopo lo svuotamento e i commenti all'interno dei callback del ciclo di vita. un'entità completa può essere visto a http://pastebin.com/yUk1u4GQDoctrine 2 PrePersist non si attiva

entità callback

/** 
* @PreUpdate 
*/ 
public function fixDates(){ 
    $this->updatedOn = $this->getNow(); 
    $this->closedDate = null; 
    $this->openDate = null; 
    print "dates fixed"; 
} 

/** 
* @PrePersist 
*/ 
public function prePersist() { 
    print 'in prePersist'; 
    die(); 
} 

Entity Manager chiama

$em->persist($school); 

$em->flush(); 
die(); 

Lo schermo si legge "date fisse", ma non il messaggio prePersist. Ho il @HasLifecycleCallbacks nella parte superiore dell'entità.

risposta

34

PrePersist viene attivato solo quando si sta eseguendo l'istruzione INSERT, non UPDATE.

Durante il test, non dimenticare che l'istruzione UPDATE viene attivata solo quando gli attributi dell'entità cambiano davvero. Se l'Entity Manager viene chiamato per mantenere quell'entità, prima controlla se ci sono cambiamenti. In caso contrario, nessuna query sql viene eseguita e non viene chiamato il metodo @PreUpdate.

+0

Voto in aumento. Ho trovato questo fuori troppo (tramite debugging passo) quando il mio codice non funzionava come mi aspettavo. IMO la documentazione attuale non lo rende abbastanza chiaro, per quello che è un errore facile da fare. – iainp999

4

Ho appena avuto lo stesso problema. Spero che questo ti aiuti:

Ho dimenticato di importare le annotazioni con l'istruzione use. Se si tenta questo non dimenticate di aggiungere il prefisso "ORM":

use Doctrine\ORM\Mapping as ORM; 

// ... 

/** 
* @ORM\PreUpdate 
*/ 
public function preUpdate() 
{ 
} 
47

Non dimenticare di abilitare Lifecycle callback nella classe di annotazione:

/** 
* Report\MainBundle\Entity\Serveur 
* @ORM\HasLifecycleCallbacks 
*/ 
class Serveur { 
+0

Questo era il mio problema. Grazie! – jasonlfunk

+0

La tua risposta risolve il mio problema. Grazie ! –

+0

Mi mancava '@ HasLifecycleCallbacks'. Grazie! – MParsons

9

So che questa domanda è quasi 2 anni , ma ho appena avuto lo stesso identico problema e dal momento che questo non ha una risposta accettata voglio condividere un'ultima cosa che tutti gli altri hanno dimenticato di menzionare.

Anche se sembra che il metodo attivato verrà utilizzato solo dalla classe entità stessa, l'ambito deve essere mantenuto pubblico. Il mio metodo non si è attivato solo perché l'ho contrassegnato come protetto. Spero che questo possa aiutare qualcuno.

3

Forse è la versione dipendente, ma le mie annotazioni di lavoro hanno una vista successiva:

Vita classe ciclo della nota:

/** 
* @Entity @Table(name="table_name") 
* @HasLifecycleCallbacks 
**/ 

Eventi annotazioni:

/** @PrePersist **/ 
/** @PreUpdate **/ 

che è tutto quello che ho in Modello.

+0

Sì !! Secondo i documenti della dottrina 2 Contrassegna un metodo sull'entità da chiamare come evento @ PrePersist. Funziona solo con @ HasLifecycleCallbacks nella classe entità PHP DocBlock. –