Listeners/Escuchadores de Eventos en Laravel - Callbacks y AutoRegistros

El siguiente punto que vamos a querer tratar es replicar lo que tenemos en la base de datos entiéndese el que rito de compras a la sesión es decir lo inverso cuándo hacemos Esto justamente cuando el usuario se autentica vamos a leer lo que tenemos en la base de datos y lo volcamos a la sesión así de simple para esto bueno pueden existir un par de maneras al menos Supongo yo una Es sobre escribiendo el mismo método que ten os para el login o nos creamos uno personalizado y justamente en ese punto Cuando hacemos el login también establecemos los datos o hacemos algo mucho más modular que sería lo recomendado que es colocando un listener Qué es un listener En caso de que no lo conozcas tal cual indica su nombre es un escuchador un escuchador en base a eventos que suceden a lo largo de la aplicación no vamos a hacer una introducción como tal a los eventos en laravel.

Evento de Login en Laravel

Pero es importante que entiendas o indicar que cuando ocurren ciertas acciones que ya se encuentran predefinidas en el sistema en este caso el login de Laravel automáticamente dispara un evento otra vez o en resumen cuando el usuario Inicia sesión entiendas el login ocurre un evento y ya esto es algo que internamente el framework hace por nosotros.

Nosotros también podemos crear eventos personalizados que luego podemos escuchar pero en este caso ya tenemos la mitad de la tarea lista ya que el evento otra vez ocurre al momento del login por lo tanto simplemente tenemos que crear un escuchador entiéndase que por una parte al igual que ocurre en javascript que ocurren o podemos implementar eventos también en este caso podemos implementar escuchadores entonces en pocas palabras vamos a implementar un escuchador un listener que va a escuchar va a llegar la redundancia cuando ocurre el evento login y cuandoo ocurre el evento login cuando aquí nos autenticamos por ejemplo entonces es así de simple Espero que al menos eso haya quedado claro porque eso es la parte más difícil.

Listener en Laravel

Existen un par de maneras se pudiera decir una es creando un listener esto ya cambió un poco así que no no te pongas a leerlo mucho ya ya vamos para allá una vez crear un listener personalizado entiéndase bueno tenemos un comando acá make listener indicamos el nombre e indicamos que evento:

$ php artisan make:listener LoginSuccessful --event=Illuminate\Auth\Events\Login

Queremos escuchar tal cual indica aquí la gente de Laravel ya automáticamente registra y encuentra el evento por nosotros es decir no hace falta registrarlo al nivel de la aplicación ya automáticamente cuando lo creemos y ocurre el evento ya automáticamente el Laravel lo ejecuta porque hace aquí un escaneo del directorio de listeners que es donde se crearía nuestro listener el que estamos creando.

app\Providers\AppServiceProvider.php
<?php

namespace App\Providers;

use App\Models\ShoppingCart;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Event;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
   public function boot(): void
   {
       Event::listen(function (Login $event) {
           $this->setShoppindCartSession();
       });
   }

   private function setShoppindCartSession()
   {
       $cartDB = ShoppingCart::where('user_id', auth()->id())->get();
       $cartSession = session('cart', []);

       foreach ($cartDB as $c) {
           if (Arr::exists($cartSession, $c->post->id)) {
               // update
               $cartSession[$c->post->id][1] = $c->count;
           } else {
               // add
               $cartSession[$c->post->id] = [$c->post, $c->count];
           }

           session(['cart' => $cartSession]);
       }
   }
}

Otra forma es también que creo que sería la más sencilla utilizando aquí un calback que directamente aquí en el a service Provider que sería este archivo que tenemos acá eh Perdón para acá Aquí también podemos colocar directamente un calvat que indique el evento y se acabó entonces puedes emplear cualquiera.

Listener para el login callback

En este caso emplear esta porque creo que es la más sencilla y eso sería prácticamente todo así que otra vez tenemos dos formas una es creando el listener para que quede el código separado Algo similar a lo que ocurre con los Gate y las políticas por dar un ejemplo en la cual podemos implementar aquí el Gate directamente o directamente colocamos una política en un archivo aparte pero en este caso como queremos hacer un sencillo Script creo que lo podemos registrar ahí sin mucho problema entonces recuerda que la documentación oficial tiene más información.

Como sucede con varias operaciones que se realizan en el framework, como el registro de usuarios, verificación de usuarios y el mismo login, estos generan eventos que se pueden escuchar mediante un listener de Laravel, en este caso, el evento de Login que es emitido mediante Fortify internamente; creamos el listener con:

$ php artisan make:listener LoginSuccessful --event=Illuminate\Auth\Events\Login

La opción de event se utiliza para indicar el evento que quieres escuchar; en este caso, el evento de login; esto lo emplea Laravel internamente para definir la estructura básica, ya el evento de autoregistra ya que es monitoreado internamente por laravel, es decir, no hace falta registrarlo.

Ahora, lo único que falta es poder hacer la réplica; para esto, vamos a tomar el método de add() definida para el componente de ítem del carrito, y lo usamos desde el listener.

El listener, busca los ítems del carrito en la base de datos, los itera uno a uno y va armando la sesión para poder usarla.

Ya con esto, si todo está correctamente configurado, al iniciar sesión, deberías de tener en la sesión, los ítems del carrito de compras (claro está, si el usuario tenía ítems agregado en dicha sesión y replicados en la base de datos).

app/Listeners/LoginSuccessful.php

<?php

namespace App\Listeners;

use App\Models\Post;
use App\Models\ShoppingCart;
use Illuminate\Auth\Events\Login;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Support\Arr;

class LoginSuccessful
{
   public function __construct()
   {
       //
   }

   public function handle(Login $event): void
   {
       $cart = ShoppingCart::where('user_id', auth()->id())->get();
       foreach($cart as $c){
           $this->add($c->post,$c->count);
       }
   }


   public function add(Post $post, $count = 1)
   {
       $cart = session('cart', []);
       
       // add
       if (Arr::exists($cart, $post->id)) {
           $cart[$post->id][1] = $count;
       } else {
           $cart[$post->id] = [$post, $count];
       }
       // set en la sesion
       session(['cart' => $cart]);
   }

}

Otra forma que tenemos disponible, es empleando un callback directamente en el AppServiceProvider:

app\Providers\AppServiceProvider.php

<?php

namespace App\Providers;

use App\Models\ShoppingCart;
use Illuminate\Auth\Events\Login;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Event;

use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
   public function boot(): void
   {
       Event::listen(function (Login $event) {
           $this->setShoppindCartSession();
       });
   }

   private function setShoppindCartSession()
   {
       $cartDB = ShoppingCart::where('user_id', auth()->id())->get();
       $cartSession = session('cart', []);

       foreach ($cartDB as $c) {
           if (Arr::exists($cartSession, $c->post->id)) {
               // update
               $cartSession[$c->post->id][1] = $c->count;
           } else {
               // add
               $cartSession[$c->post->id] = [$c->post, $c->count];
           }

           session(['cart' => $cartSession]);
       }
   }
}

- Andrés Cruz

In english

Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.

!Cursos desde!

10$

En Udemy

Quedan 2d 20:32!


Udemy

!Cursos desde!

4$

En Academia

Ver los cursos

!Libros desde!

1$

Ver los libros
¡Hazte afiliado en Gumroad!