Los Observers en Laravel son clases que permiten escuchar y manejar eventos del ciclo de vida de los modelos Eloquent, como creating
, updating
, o deleting
. Son una solución elegante para mantener el código más organizado al encapsular la lógica relacionada con estos eventos.
Un observer es una clase que contiene métodos para reaccionar a eventos específicos de un modelo Eloquent. Estos eventos permiten ejecutar acciones automáticamente antes o después de que ocurra un cambio en los datos del modelo, como la creación o eliminación de un registro.
Evento | Descripción |
---|---|
creating
|
Antes de insertar un registro en la base de datos. |
created
|
Después de insertar un registro en la base de datos. |
updating
|
Antes de actualizar un registro existente. |
updated
|
Después de actualizar un registro existente. |
deleting
|
Antes de eliminar un registro. |
deleted
|
Después de eliminar un registro. |
restoring
|
Antes de restaurar un registro eliminado (soft delete). |
restored
|
Después de restaurar un registro eliminado (soft delete). |
Para generar un observer, usa el comando Artisan:
php artisan make:observer NombreObserver --model=Modelo
Este comando crea un archivo en App/Observers
y lo asocia al modelo especificado.
Debes registrar el observer en el método boot
del AppServiceProvider
o en un servicio dedicado:
use App\Models\Modelo;
use App\Observers\NombreObserver;
public function boot()
{
Modelo::observe(NombreObserver::class);
}
En la clase del observer, define los métodos correspondientes a los eventos que deseas manejar. Por ejemplo:
namespace App\Observers;
use App\Models\Modelo;
class NombreObserver
{
public function creating(Modelo $modelo)
{
$modelo->slug = \Str::slug($modelo->titulo); // Generar slug antes de crear
}
public function deleting(Modelo $modelo)
{
// Acción personalizada antes de eliminar
\Log::info("Se eliminó el modelo con ID: {$modelo->id}");
}
}
Cada vez que realices una operación que dispare un evento del modelo, el observer ejecutará automáticamente el código asociado al evento correspondiente.
1. Código más limpio: Mantiene la lógica del modelo separada de sus eventos.
2. Reutilización: Centraliza la lógica común de eventos para un modelo.
3. Facilidad de mantenimiento: Facilita la localización y modificación de la lógica asociada a los eventos.
Supongamos que quieres generar automáticamente un slug
para un modelo Post
cada vez que se cree un registro.
1. Generar el observer:
php artisan make:observer PostObserver --model=Post
2. Implementar la lógica en el observer:
namespace App\Observers;
use App\Models\Post;
use Illuminate\Support\Str;
class PostObserver
{
public function creating(Post $post)
{
$post->slug = Str::slug($post->title);
}
}
3. Registrar el observer:
use App\Models\Post;
use App\Observers\PostObserver;
public function boot()
{
Post::observe(PostObserver::class);
}
Cada vez que crees un nuevo Post
, el slug
se generará automáticamente.
Consulta la documentación oficial de Laravel sobre observers para obtener más información.
Jorge García
Fullstack developer