Eventos y Listeners en Laravel

Clase 13 de 33Curso Avanzado de Laravel

Resumen

Aprende a usar eventos y listeners en Laravel para automatizar acciones clave: crear un evento cuando un producto es calificado, dispararlo desde un tray y responder con un email de notificación. Verás cómo intervienen EventServiceProvider, el arreglo listen, el helper event, el constructor del evento, el método broadcastOn y los getters.

¿Qué es el manejo de eventos en Laravel y para qué sirve?

Los eventos permiten reaccionar a acciones del usuario dentro del ciclo de vida de la aplicación. Cada acción (clic, teclas) genera un objeto de evento, y un listener captura ese evento para ejecutar lógica.

  • Evento: representa una acción iniciada por el usuario y crea un objeto nuevo.
  • Listener: clase que escucha eventos específicos y ejecuta una acción.
  • Ciclo de vida: el sistema puede disparar eventos en distintos puntos.

¿Dónde se registran en EventServiceProvider?

El corazón está en EventServiceProvider dentro de app/providers. Ahí, el arreglo listen mapea eventos con listeners. Ya existe un ejemplo: cuando se registra un usuario, se envía un email de verificación. Ese patrón guía el registro de tus propios eventos.

¿Qué hace un listener y cuándo actúa?

Un listener tiene un constructor para inyectar servicios y un método handle con la lógica. Escucha un evento específico y se ejecuta cuando ese evento se dispara.

¿Cómo crear y estructurar un evento personalizado en Laravel?

Primero se crea el evento con PHP Artisan make event. En el caso explicado, se define un evento para cuando se califique una entidad, llamado "model rated". El archivo queda en la carpeta events y contiene un constructor y el método broadcast on (no usado por ahora).

  • Recibe: el modelo del calificador, el modelo del producto calificado y el score de la calificación.
  • Declara propiedades e inicializa en el constructor.
  • Implementa getters para recuperar datos al transmitir el evento.

Luego se añade el disparo del evento al tray "can rate". Dentro del método "rate", después de completar la operación, se dispara con el helper event creando una instancia de "model rate rated" con: el calificador (this), el modelo calificado (parámetro) y el score.

¿Dónde y cómo dispararlo con el helper event?

Se coloca el disparo al final del método "rate" del tray. Se usa el helper event con la nueva instancia del evento y los tres datos: quien califica, el modelo calificado y la puntuación.

¿Cómo escuchar el evento y enviar una notificación por email?

Se crea un listener con php artisan make listener para enviar un correo a quienes hayan creado productos cuando estos sean calificados. El listener recibe solo el evento "model rated" y en el método handle ejecuta la lógica.

  • Obtiene el ratable desde el evento usando el getter. Corrige el nombre a "ratable" si es necesario.
  • Verifica si es instancia de producto para actuar solo en ese caso.
  • Crea una notificación y la envía al usuario creador del producto vía la relación "created by" con notify.

¿Qué incluye la notificación por correo?

Se crea con PHP Artisan mail notification. La notificación recibe tres datos: el nombre del calificador, el nombre del producto y el score. El email muestra un mensaje como: "[nombre] ha calificado tu producto [producto] con [score] estrellas". Ejemplo: "Sergio ha calificado tu producto Sarasa con cinco estrellas".

  • Propiedades: qualifier name (string), product name, score.
  • Constructor: inicializa dichas propiedades.
  • Contenido del email: mensaje personalizado con esos datos.

¿Cómo registrar el mapeo evento-listener?

Con el evento y el listener listos, se registran en EventServiceProvider dentro del arreglo listen: el evento "Model rated Class" y su listener "Send email model rated notification". Tras esto, solo queda probar.

¿Te animas a implementar el evento "un rate model" que se dispara cuando un usuario califica un producto? Comparte tus dudas o avances en los comentarios.