Ver índice de contenidos del libro

8.5. Lifecycle Callbacks 

En ocasiones, es necesario realizar una acción justo antes o después de insertar, actualizar o eliminar una entidad. Este tipo de acciones se conocen como lifecycle callbacks, ya que son métodos (o callbacks) que se ejecutan en alguna de las diferentes etapas por las que pasa una entidad (lifecycle).

Si utilizas anotaciones para los metadatos, debes activar primero los lifecycle callbacks. Si utilizas YAML o XML, no es necesario que lo hagas:

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Product
{
    // ...
}

Ahora ya puedes decir a Doctrine que ejecute un método en cualquiera de los eventos disponibles durante el ciclo de vida de la entidad. Supongamos por ejemplo que deseas establecer el valor de una columna de fecha created a la fecha actual, sólo cuando se persiste por primera vez la entidad (es decir, cuando se inserta):

/**
 * @ORM\PrePersist
 */
public function setCreatedValue()
{
    $this->created = new \DateTime();
}
# src/Acme/StoreBundle/Resources/config/doctrine/Product.orm.yml
Acme\StoreBundle\Entity\Product:
    type: entity
    # ...
    lifecycleCallbacks:
        prePersist: [setCreatedValue]
<!-- src/Acme/StoreBundle/Resources/config/doctrine/Product.orm.xml -->
 
<!-- ... -->
<doctrine-mapping>
 
    <entity name="Acme\StoreBundle\Entity\Product">
            <!-- ... -->
            <lifecycle-callbacks>
                <lifecycle-callback type="prePersist" method="setCreatedValue" />
            </lifecycle-callbacks>
    </entity>
</doctrine-mapping>

Nota En el ejemplo anterior se supone que antes has creado y mapeado una propiedad llamada created.

Ahora, justo antes de persistir la entidad por primera vez, Doctrine ejecuta automáticamente este método y establecerá el campo created a la fecha actual.

Esto también se puede aplicar a cualquiera de los otros eventos del ciclo de vida:

  • preRemove
  • postRemove
  • prePersist
  • postPersist
  • preUpdate
  • postUpdate
  • postLoad
  • loadClassMetadata

Para más información sobre qué significan estos eventos y los lifecycle callbacks, consulta la sección Events de la documentación de Doctrine.