Qué son los eventos del modelo
Los modelos Eloquent disparan eventos automáticamente en cada etapa de su ciclo de vida. Al engancharte a ellos puedes intercalar tu propia lógica antes o después de guardar, borrar, etc. Los eventos que dispara Eloquent son los siguientes.| Evento | Momento en el que se dispara |
|---|---|
retrieved | Al recuperar un modelo de la BD. |
creating | Justo antes de guardar un modelo nuevo. |
created | Justo después de guardar un modelo nuevo. |
updating | Justo antes de actualizar un modelo existente. |
updated | Justo después de actualizar un modelo existente. |
saving | Justo antes de guardar (tanto en creación como en actualización). |
saved | Justo después de guardar (tanto en creación como en actualización). |
deleting | Justo antes de borrar el modelo. |
deleted | Justo después de borrar el modelo. |
trashed | Justo después de un soft delete. |
forceDeleting | Justo antes de un borrado físico. |
forceDeleted | Justo después de un borrado físico. |
restoring | Justo antes de restaurar un soft delete. |
restored | Justo después de restaurar un soft delete. |
replicating | Al llamar a replicate(). |
-ing se disparan antes de persistir los cambios; los terminados en -ed, después.
Listeners de eventos mediante closures
Si quieres tratar los eventos de forma sencilla, puedes registrar closures dentro del métodobooted del modelo.
queueable.
Propiedad $dispatchesEvents
Si quieres integrarte con el sistema de eventos de Laravel, la propiedad $dispatchesEvents te permite mapear eventos del modelo a tus propias clases de evento.
Crear una clase Observer
Si vas a manejar varios eventos de un mismo modelo, es más limpio reunirlos en una clase Observer que ir apilando closures.Generar la clase con un comando Artisan
Genera el esqueleto con Se crea
make:observer. Con la opción --model indica el modelo y se añaden automáticamente los métodos correspondientes.app/Observers/UserObserver.php.Implementar los métodos de cada evento
Los nombres de los métodos se corresponden con los nombres de los eventos. El argumento recibe la instancia del modelo.
Registrar el Observer en el modelo
Hay dos formas de registrarlo. En Laravel 13, la recomendación es usar el atributo Para registrar varios observers, repite el atributo o pásalos como array.Opción 2: registrarlo en
#[ObservedBy].Opción 1: atributo #[ObservedBy] (recomendado)Basta con añadir el atributo a la clase del modelo. No necesitas tocar AppServiceProvider.AppServiceProviderLlama a observe en el método boot de AppServiceProvider.El atributo
#[ObservedBy] está en el namespace Illuminate\Database\Eloquent\Attributes. Es sintaxis nativa de PHP 8.0 y Laravel 13 la utiliza de forma activa.Observers dentro de transacciones de base de datos
Si un modelo se crea o actualiza dentro de una transacción, a veces querrás que el Observer se ejecute después del commit. Implementando la interfazShouldHandleEventsAfterCommit obtendrás ese comportamiento.
Desactivar los eventos temporalmente
withoutEvents para silenciar eventos solo en un bloque
Dentro del closure que pasas a User::withoutEvents(), no se dispara ningún evento del modelo.
saveQuietly para no disparar eventos al guardar
Si quieres guardar sin disparar eventos, utiliza saveQuietly.
Casos de uso prácticos
Limpieza automática de caché
Cuando un modelo se actualiza o se borra, limpia automáticamente la caché relacionada.Registro de audit log
Registra automáticamente el histórico de cambios de un modelo. CongetDirty() obtienes los valores modificados.
Actualización automática de modelos relacionados
Ejemplo para actualizar automáticamente el stock cuando se completa un pedido.Próximos pasos
Avanzado: Atributos de PHP
Aprende los atributos de PHP de Laravel 13, incluido
#[ObservedBy], en un solo lugar.