Laravel es un framework de PHP conocido por su elegancia y facilidad de uso. Una de sus características más poderosas es su sistema de eventos, que permite a los desarrolladores ejecutar acciones en respuesta a ciertos eventos dentro de la aplicación.
¿Qué es el sistema de eventos en Laravel?
El sistema de eventos en Laravel permite desacoplar ciertas partes de una aplicación mediante la ejecución de eventos y la escucha de estos con listeners (escuchadores). Un evento es una acción o cambio en la aplicación, mientras que un listener es una clase que ejecuta lógica específica cuando ese evento ocurre.
Configuración inicial en Laravel
Antes de empezar, asegúrate de tener un proyecto Laravel funcionando. Si no lo tienes, puedes crear uno con:
composer create-project --prefer-dist laravel/laravel MiProyecto
Luego, ingresa al directorio del proyecto:
cd MiProyecto
Ejecuta las migraciones para generar la estructura de base de datos inicial:
php artisan migrate
Creación de un evento en Laravel
Laravel nos proporciona el comando make:event
para crear un evento. Supongamos que estamos construyendo un sistema de pedidos y queremos lanzar un evento cuando se cree un pedido.
php artisan make:event PedidoCreado
Esto generará un archivo en app/Events/PedidoCreado.php
con el siguiente código base:
namespace App\Events;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
use App\Models\Pedido;
class PedidoCreado
{
use Dispatchable, SerializesModels;
public $pedido;
public function __construct(Pedido $pedido)
{
$this->pedido = $pedido;
}
}
Creación de un Listener para capturar el evento
Ahora, creamos un listener que responderá a este evento.
php artisan make:listener EnviarNotificacionPedido --event=PedidoCreado
Este comando generará un archivo en app/Listeners/EnviarNotificacionPedido.php
:
namespace App\Listeners;
use App\Events\PedidoCreado;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Mail;
use App\Mail\PedidoConfirmado;
class EnviarNotificacionPedido implements ShouldQueue
{
use InteractsWithQueue;
public function handle(PedidoCreado $event)
{
Mail::to($event->pedido->usuario->email)->send(new PedidoConfirmado($event->pedido));
}
}
Registrar los eventos y listeners en Laravel
En app/Providers/EventServiceProvider.php
, registramos el evento con su listener dentro de la propiedad $listen
:
protected $listen = [
PedidoCreado::class => [
EnviarNotificacionPedido::class,
],
];
Para que Laravel detecte los cambios, ejecutamos:
php artisan event:clear
php artisan event:cache
Lanzar el evento desde un controlador
En app/Http/Controllers/PedidoController.php
, disparamos el evento cuando se crea un pedido:
namespace App\Http\Controllers;
use App\Models\Pedido;
use App\Events\PedidoCreado;
use Illuminate\Http\Request;
class PedidoController extends Controller
{
public function store(Request $request)
{
$pedido = Pedido::create([
'usuario_id' => auth()->id(),
'total' => $request->total,
'estado' => 'pendiente'
]);
event(new PedidoCreado($pedido));
return response()->json(['message' => 'Pedido creado y evento disparado.']);
}
}
Probando el sistema de eventos en Laravel
Para probar si el evento y listener funcionan correctamente, podemos hacer una solicitud POST al endpoint:
curl -X POST http://localhost/api/pedidos \
-H "Content-Type: application/json" \
-H "Authorization: Bearer TU_TOKEN" \
-d '{"total": 100.50}'
Conclusión
El sistema de eventos de Laravel es una herramienta increíblemente útil para desacoplar la lógica de negocio y responder de manera eficiente a los cambios en la aplicación. En este tutorial, aprendimos a:
- Crear eventos y listeners en Laravel.
- Registrar y despachar eventos.
- Ejecutar eventos en segundo plano con colas.
Este sistema nos permite mejorar la estructura de nuestra aplicación y hacerla más mantenible y escalable.