Aprende a agregar un detector de eventos para el evento de inicio de sesión con FOSUserBundle en Symfony 3.

Normalmente, la implementación de FOSUserBundle tiende a ser sencilla y resuelve casi todos sus requisitos. Sin embargo, hay tareas especiales que probablemente sean difíciles de encontrar en la documentación oficial o que no sean fáciles de entender. Una de estas tareas es hacer algo después de que un usuario inicie una sesión con éxito (iniciando sesión en su aplicación) y necesita saber cuándo un usuario lo hace para poder hacer algo adicional (agregar parámetros en la sesión de acuerdo con el correo electrónico, etc.) .

Puede reemplazar fácilmente el "detector de eventos" modificando el código en el paquete (directorio de proveedores), sin embargo, esto no se recomienda ya que es una mala práctica y sus cambios se perderán en cualquier actualización, por lo tanto, es recomendable agregar un detector de eventos de inicio de sesión en su lugar.

En este artículo, aprenderá cómo escuchar específicamente el evento de inicio de sesión cuando un usuario inicia sesión con éxito en su aplicación.

Implementación

La forma recomendada es crear una carpeta con el nombre Listeners en su paquete y crear una clase con el nombre LoginListenerdentro con el siguiente código:

Nota: no olvide cambiar el espacio de nombres de la clase de acuerdo con el nombre de su paquete y la ubicación de la clase.

<?php

// Cambie el espacio de nombres de acuerdo con la ubicación de esta clase en su paquete
namespace myBundle\Listeners;

use FOS\UserBundle\Model\UserManagerInterface;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

class LoginListener {
    
    protected $userManager;
    
    public function __construct(UserManagerInterface $userManager){
        $this->userManager = $userManager;
    }
    
    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event)
    {
        $user = $event->getAuthenticationToken()->getUser();
        
        // Para probar si funciona, cree un archivo con el nombre login.txt en la ruta / web de su proyecto
        $myfile = fopen("login.txt", "w");
        fwrite($myfile, 'onSecurityInteractiveLogin succesfully executed !');
        fclose($myfile);
        // hacer algo más
        // return new Response(); 
    }
}

Ahora que tiene una clase que manejará el evento, debe registrarla como servicio en el archivo services.yml de su proyecto:

services:
    login_listener:
        # path of the previously created class
        class:  myBundle\Listeners\LoginListener
        arguments:
            userManager: "@fos_user.user_manager"
        tags:
            - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

Finalmente, recuerde borrar el caché (manualmente o con el comando) y proceda a iniciar sesión en su proyecto. Como se hizo en este ejemplo, login.txtse creará un archivo (" ") en el directorio web de su proyecto solo con fines de prueba, no dude en cambiarlo para obtener una respuesta o lo que necesite hacer.

Que te diviertas ❤️!


Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores