Symfony 3.3 : Comment afficher tous les utilisateurs actifs connectés

Comment afficher tous les utilisateurs connectés de mon application en utilisant les services, un listener et FosUser.

Dans cet article, nous allons utiliser ce qui est existant : ActivityListener. En effet, je ne vais pas recréer la roue mais l’adapter à la version 3.3.

Actuellement, je n’ai trouvé que des scripts d’ActivityListener pour les versions inférieures à 3.3 ou supérieures à 3.4.

Ma version adaptée s’appuie sur le FosUser et les services de Symfony.

Etape 1 : Nous allons modifier l’entité « User » de Symfony pour rajouter le champ « LastActivityAt ».


/**
 * Date/Time of the last activity
 *
 * @var \Datetime
 * @ORM\Column(name="last_activity_at", type="datetime", nullable=true)
 */
protected $lastActivityAt;

/**
 * @param \Datetime $lastActivityAt
 */
public function setLastActivityAt($lastActivityAt)
{
    $this->lastActivityAt = $lastActivityAt;
}

/**
 * @return \Datetime
 */
public function getLastActivityAt()
{
    return $this->lastActivityAt;
}

/**
 * @return Bool Whether the user is active or not
 */
public function isActiveNow()
{
    // Delay during wich the user will be considered as still active
    $delay = new \DateTime('2 minutes ago');

    return ( $this->getLastActivityAt() > $delay );
}

L’utilisateur est considéré actif jusqu’à 2 minutes d’inactivité.

Etape 2 : On va créer un event afin d’y mettre notre fonction : ActivityListener.php

<?php
namespace Jon\SnowBundle\Services;


use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\HttpKernel;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
use FOS\UserBundle\Model\UserInterface;
use FOS\UserBundle\Model\UserManagerInterface;

class ActivityListener
{
	protected $tokenStorage;
    protected $userManager;

    public function __construct(TokenStorage  $tokenStorage, UserManagerInterface $userManager)
    {
        $this->tokenStorage = $tokenStorage;
        $this->userManager = $userManager;
    }

    /**
    * Update the user "lastActivity" on each request
    * @param FilterControllerEvent $event
    */
    public function onCoreController(FilterControllerEvent $event)
    {
		$user = $this->tokenStorage->getToken()->getUser();

        if ($user instanceof UserInterface) {
            $user->setLastActivityAt(new \DateTime());
            $this->userManager->updateUser($user);
		}
    }
}

Etape 3 : On ajoute dans Services.yml le script suivant :

parameters:
    jon_snow.activity_listener.class: Jon\SnowBundle\Services\ActivityListener

services:
    jon_snow.activity_listener:
        class: %jon_snow.activity_listener.class%
        arguments: ['@security.token_storage','@fos_user.user_manager' ]
        tags:
            - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }

Etape 4 : On vide le cache complet (Dev et Prod).


Voilà. Adaptez le script en fonction de vos besoins. Vérifiez si LastActivityAt est bien alimentée.

Sources :

  • https://stackoverflow.com/questions/21096689/symfony-how-to-return-all-logged-in-active-users/21102160
  • https://stackoverflow.com/questions/36870272/how-to-get-the-current-logged-user-in-a-service
  • https://openclassrooms.com/forum/sujet/symfony2-membre-en-ligne
  • Regardez dans les services de FoSUSER

Auteur MisterTeed