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 cambios dentro de la aplicación.
¿Qué es el sistema de eventos en Laravel?
El sistema de eventos permite desacoplar 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 siguiendo la guía oficial de instalación de Laravel:
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 eventos. Supongamos que estamos construyendo un sistema de pedidos y queremos lanzar uno 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
(Más detalles sobre cómo trabajar con el Event Service Provider).
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
Para probar si todo funciona 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.
- Registrar y despachar eventos.
- Ejecutar eventos en segundo plano con colas.
Este enfoque mejora la estructura de nuestras aplicaciones, haciéndolas más mantenibles y escalables.