El día de hoy tengo un objetivo, enseñarte cómo funcionan a profundidad los Eventos de Laravel, buscaré describirte su funcionalidad y los casos de uso en donde le puedes sacar el máximo partido, ¿me acompañas?.
Antes de empezar con el artículo, me gustaría compartirte que estaré compartiendo frecuentemente material relacionado con Laravel en el blog, debido a que se ha convertido en mi framework favorito para desarrollar sitios web en PHP, así que si te interesa, puedes suscribirte al blog para recibir notificaciones cuando publique material.
¿Qué son los eventos en Laravel?
Los eventos en Laravel nos proporcionan observadores para determinadas funcionalidades en nuestra aplicación, es decir, nos permitirán rastrear los eventos que suceden, como por ejemplo: enviar un correo de bienvenida cuando un usuario se registra, esto lo podemos hacer con los eventos.
Podemos definir toda una estructura dentro de los controladores, pero no sería lo ideal ya que estaremos sobrecargando de código los controladores y estaríamos cayendo en malas prácticas, es por eso que te voy a explicar a detalle como puedes integrar un evento en tu aplicación de Laravel.
En pocas palabras, podemos ver a un evento como una función que se ejecuta cuando una acción suceda en nuestra aplicación.
¿Para qué sirven los eventos?
Los eventos nos ayudan a ejecutar funciones a través del patrón observer, esto quiere decir que cada vez que nosotros ejecutemos determinadas acciones dentro de nuestra aplicación, un observer estará esperando a que sea llamado para lanzar eventos que nosotros definimos.
¿Cómo se genera un evento en Laravel?
Hay dos formas en las que se pueden generar eventos en Laravel, una de ellas es a través de la consola utilizando artisan con el comando php artisan make:event NombreDeTuEvento
.
La otra forma de generar eventos en Laravel es a través del EventServiceProvider en donde nosotros podemos mapear todas las clases de los eventos que tenemos.
Lo recomendable sería que generarás los eventos a través de la consola, pero hay ocasiones en donde solamente basta con registrar el evento a través del EventServiceProvider, esto ya dependerá de las necesidades de tu proyecto.
¿Qué son los listeners?
Siempre que trabajemos con eventos en Laravel, vamos a escuchar de los listeners, los cuales te explico que son a continuación.
Los listeners nos ayudan a definir toda la lógica de nuestros eventos, es decir, supongamos que hay un nuevo usuario que se registró en nuestra plataforma, el evento se ejecuta recibiendo todos los datos del registro del usuario, los asignamos en un constructor y se lo pasamos directamente al listener que definamos para ahí mandar un correo de bienvenida.
Un evento puede tener múltiples listeners
Supongamos que en nuestra tienda hubo un nuevo pedido y necesitamos mandar una notificación a través de correo y otra por SMS, lo ideal sería dirigir cada notificación por un listener diferente, aquí ya hemos implementado 2 listeners para un mismo evento, ¿es genial no?.
Te recomiendo leer la documentación oficial de Laravel, en donde puedes consultar toda la información detallada sobre los listeners y eventos en Laravel: Documentación Laravel.
Ejemplo de eventos en Laravel
Vamos a registrar un evento que se ejecuta cuando un usuario se registra en nuestra plataforma para enviarle un correo de bienvenida.
Vamos a definir nuestro evento.
App\Events\UserRegistered.php
<?php namespace App\Events; use App\User; .... class UserRegistered { use Dispatchable, InteractsWithSockets, SerializesModels; public $user; /** * Create a new event instance. * * @return void */ public function __construct(User $user) { $this->user = $user; } }
Nuestro evento necesita lógica, es por eso que vamos a registrar nuestro listener.
App\Listeners\SendWelcomeEmail.php
<?php namespace App\Listeners; .... use Mail; class SendWelcomeEmail { .... .... /** * Handle the event. * * @param UserRegistered $event * @return void */ public function handle(UserRegistered $event) { $data = array('name' => $event->user->name, 'email' => $event->user->email, 'body' => 'Bienvenido a mi sitio personal en donde comparto artículos de desarrollo web.'); Mail::send('emails.mail', $data, function($message) use ($data) { $message->to($data['email']) ->subject('Bienvenido a Gabriel Chávez'); $message->from('[email protected]'); }); } }
Muy bonito y todo, pero hasta ahora no se envia el correo, ¿qué está pasando Gabriel?, tranquilo, solo hace falta instanciar nuestro evento, el cual lo vamos a mandar llamar directo desde nuestro controlador.
App\Http\Controllers\RegisterController.php
<?php namespace App\Http\Controllers\Auth; .... use App\Events\UserRegistered; class RegisterController extends Controller { ..... ..... /** * Create a new user instance after a valid registration. * * @param array $data * @return \App\User */ protected function create(array $data) { $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => bcrypt($data['password']), ]); // call our event here event(new UserRegistered($user)); return $user; } }
Como puedes ver, una vez que se insertan los datos en el modelo User, mandamos a llamar al evento UserRegistered junto con la variable que contiene todos los datos del usuario que se ha registrado.
Espero que haya sido de utilidad este artículo para resolver tus dudas acerca de los eventos, si tienes cualquier otra duda no dudes en escribir en la caja de los comentarios, será todo un gusto poder ayudarte a aclarar todo.
Si te gusto este artículo compártelo en redes sociales, deja un comentario o suscribete a mi newsletter, me ayudarás a seguir trayendo contenido de calidad al blog totalmente gratis.
Obtén beneficios exclusivos
Suscríbete al boletín y obtén beneficios exclusivos directo en tu correo.
Gracias por suscribirte...
Algo salió mal...
Muy bien explicado. Fácil de entender y muy útil. Podemos evitar con los eventos y listeners la sobrecarga de código en los controladores.
Gracias
Hola Belkin, tienes toda la razón, entre más limpio tengamos nuestros controladores resultará mejor para realizar tareas de mantenimiento en nuestros sistemas.
Saludos Belkin.
Se puede sacar mas provecho, al utilizar inyección de dependencia, así se logra un total desacoplamiento y no tiene dependencia directa con el controlador, Saludos
Totalmente de acuerdo Miguel, de hecho, esa es la mejor manera de hacerlo, tener todo en los controladores sumaría una cantidad inmensa de posibles errores y si hay mucho código, agregaría un poco de deuda técnica.
Saludos.
Gracias por este post, Gabriel. Es una de las pocas entradas en español sobre este tema. Por cierto ¿Alguna vez has escuchado sobre o has implementado el patrón «Event Sourcing» con Laravel?
Es obligatiorio registrar los listener en los eventos dentro de la clase EventServiceProvider, veo que en el ejemplo no hiciste esa asignación, entonces como el evento sabe que listeners va a ejecutar si no hiciste el registro en el eventservi….