Listeners a jobs con JobQueue en Laravel

Clase 16 de 33Curso Avanzado de Laravel

Contenido del curso

Laravel y Base de Datos

    Resumen

    Transformar cualquier listener en una cola de trabajo es una de las capacidades más potentes de Laravel. Con solo implementar una interfaz, los procesos pesados como el envío de correos o la actualización de registros pasan a ejecutarse en segundo plano, devolviendo respuestas inmediatas al usuario.

    ¿Cómo convertir un listener en un job con ShouldQueue?

    El proceso es sorprendentemente sencillo. Dentro de cada listener que ya tengas creado, solo necesitas implementar la interfaz ShouldQueue [0:28]. Por ejemplo, si tienes un listener que envía un correo electrónico cuando un modelo es calificado, basta con agregar implements ShouldQueue a la clase.

    Al hacer esto, le estás indicando a Laravel que cada vez que levante ese listener, lo convierta automáticamente en un job. El resultado es inmediato: cuando se dispara el evento, la respuesta llega al cliente sin demora y el trabajo queda registrado en la tabla jobs de la base de datos [1:08].

    Si tienes corriendo el comando php artisan queue:work, el job se ejecutará de forma automática en segundo plano [1:18].

    ¿Cómo crear un job que actualice el último login del usuario?

    Un caso práctico muy común es registrar la última vez que un usuario inició sesión. Para lograrlo se siguen estos pasos:

    ¿Cómo preparar la base de datos con una migración?

    Primero, se crea una migración que agregue una nueva columna a la tabla de usuarios [2:08]:

    • La columna se llama last_login.
    • Es de tipo timestamp.
    • Se ejecuta con php artisan migrate.

    ¿Cómo crear y configurar el job UpdateLastLogin?

    Desde la terminal se genera el job con el comando:

    bash php artisan make:job UpdateLastLogin

    Dentro del archivo generado, el método handle recibe el evento de login, que viene por defecto en el framework [2:48]. La lógica dentro del job es la siguiente:

    php public function handle(Login $event) { $user = $event->user; $user->last_login = Carbon::now(); $user->save(); }

    • Se obtiene el usuario desde $event->user.
    • Se asigna la fecha actual a la columna last_login utilizando Carbon, una librería de manipulación de fechas muy popular en PHP [3:12].
    • Se persiste el registro con save().

    La clase del job debe tener implementada la interfaz ShouldQueue para que se procese en segundo plano [3:22].

    ¿Cómo registrar el evento en el EventServiceProvider?

    Dentro del EventServiceProvider, se escucha el evento de login y se asocia al job recién creado [3:28]:

    • Se importa el evento Login.
    • Se indica que al dispararse ese evento, se ejecute UpdateLastLogin.

    Al iniciar sesión en la aplicación, el job se crea dentro de la tabla jobs en la base de datos. Al correr php artisan queue:work, el trabajo se procesa y la columna last_login queda actualizada con la fecha actual [3:52].

    ¿Qué drivers ofrece Laravel para trabajar con queues?

    Laravel soporta múltiples drivers para manejar las colas de trabajo: base de datos, Redis, Amazon SQS, entre otros [4:18]. Cada uno tiene sus ventajas dependiendo del entorno y la escala del proyecto.

    Para proyectos que usen Redis, existe una herramienta de monitoreo llamada Laravel Horizon que permite visualizar y gestionar los jobs en tiempo real desde una interfaz gráfica [4:26].

    ¿Ya probaste a convertir tus listeners en jobs? Comparte en los comentarios qué driver estás utilizando y cómo te fue con el ejercicio.