2011-10-28 14 views
15

Dentro de la misma entidad tengo PreUpdate y PrePersist. PreUpdate activa, pero el PrePersist nunca lo hace. Puse un die() después de la descarga y los comentarios dentro de las devoluciones de llamada del ciclo de vida. entidad completa se puede ver en http://pastebin.com/yUk1u4GQDoctrine 2 PrePersist no se activa

devoluciones de llamada Entidad

/** 
* @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(); 
} 

del gestor de entidades llamadas

$em->persist($school); 

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

Mi pantalla se lee "fechas fijas", pero no el mensaje PrePersist. Tengo el @HasLifecycleCallbacks en la parte superior de la entidad.

Respuesta

34

PrePersist solo se activa cuando se realiza la instrucción INSERT, no la declaración UPDATE.

Al realizar pruebas, no olvide que la instrucción UPDATE se activa solo cuando los atributos de la entidad realmente cambian. Si se llama al administrador de la entidad para persistir esa entidad, primero se ve si hay algún cambio. Si no, no se realiza ninguna consulta sql y no se llama al método @PreUpdate.

+0

Votación máxima. Descubrí esto de la peor manera (a través de la depuración por pasos) cuando mi código no funcionaba como esperaba. IMO la documentación actual no lo aclara lo suficiente, por lo que es un error fácil de hacer. – iainp999

4

Acabo de tener el mismo problema. Espero que esto te ayude:

Olvidé importar las anotaciones con la instrucción de uso. Si intenta esto no se olvide de añadir el "ORM" prefijo:

use Doctrine\ORM\Mapping as ORM; 

// ... 

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

No se olvide de permitir que las devoluciones de llamada de ciclo de vida en su clase de anotación:

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

Este era mi problema. ¡Gracias! – jasonlfunk

+0

Tu respuesta resuelve mi problema. Gracias ! –

+0

Me faltaba '@ HasLifecycleCallbacks'. ¡Gracias! – MParsons

9

Sé que esta pregunta es de casi 2 años , pero tenía exactamente el mismo problema y como esto no tiene una respuesta aceptada, quiero compartir una última cosa que todos los demás olvidaron mencionar.

Aunque parece que el método desencadenado será utilizado solo por la propia clase de entidad, su alcance debe mantenerse público. Mi método no se disparaba solo porque lo marqué como uno protegido. Espero que esto ayude a alguien.

3

Tal vez la versión dependiente pero mis anotaciones de trabajo tienen una vista siguiente:

vida anotación clase ciclo:

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

Eventos anotaciones:

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

Eso es todo lo que tengo en Modelo.

+0

¡Sí! De acuerdo con los documentos de la doctrina 2 Marca un método en la entidad que se llamará como un evento @ PrePersist. Solo funciona con @ HasLifecycleCallbacks en la clase de entidad PHP DocBlock. –