Skip to main content

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. Los eventos terminados en -ing se disparan antes de persistir los cambios; los terminados en -ed, después.
Las actualizaciones y borrados masivos (como User::where(...)->update(...)) no disparan los eventos saving, saved, updating, updated, deleting ni deleted, porque en realidad no se recuperan modelos.

Listeners de eventos mediante closures

Si quieres tratar los eventos de forma sencilla, puedes registrar closures dentro del método booted del modelo.
Si quieres ejecutar la lógica de forma asíncrona en una cola, utiliza el helper 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.
Las clases de evento mapeadas reciben la instancia del modelo en el constructor.

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.
1

Generar la clase con un comando Artisan

Genera el esqueleto con make:observer. Con la opción --model indica el modelo y se añaden automáticamente los métodos correspondientes.
Se crea app/Observers/UserObserver.php.
2

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.
3

Registrar el Observer en el modelo

Hay dos formas de registrarlo. En Laravel 13, la recomendación es usar el atributo #[ObservedBy].Opción 1: atributo #[ObservedBy] (recomendado)Basta con añadir el atributo a la clase del modelo. No necesitas tocar AppServiceProvider.
Para registrar varios observers, repite el atributo o pásalos como array.
Opción 2: registrarlo en 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 interfaz ShouldHandleEventsAfterCommit obtendrás ese comportamiento.
Fuera de transacciones, se ejecuta inmediatamente como de costumbre.

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.
Existen métodos equivalentes para borrado, restauración y replicación.

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. Con getDirty() obtienes los valores modificados.
El evento updating se dispara antes de persistir en la BD, así que getDirty() te devuelve los valores que van a cambiar. Si lo llamas después de updated, getDirty() estará vacío.

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.
Última modificación el 13 de julio de 2026