IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

Afficher les utilisateurs actifs


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Septembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 24
    Par défaut Afficher les utilisateurs actifs
    Bonjour,

    Je suis en train d'utiliser le FOSUserBundle dans mon projet Symfony 4. Je veux lister les utilisateurs connectés afin de créer un chat sur le site. Du coup j'ai ajouté la propriété lastActivityAt et ajouter, également, un getter et un setter pour cette propriété:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
         * 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;
        }
    Et puis j'ai ajouté une méthode pour vérifier la connectivité de l'utilisateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /**
         * @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->setLastActivityAt($delay));
        }
    J'ai ajouté un listener:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    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)
        {
            // Check that the current request is a "MASTER_REQUEST"
            // Ignore any sub-request
            if ($event->getRequestType() !== HttpKernel::MASTER_REQUEST) {
                return;
            }
     
            // Check token authentication availability
            if ($this->tokenStorage->getToken()) {
                $user = $this->tokenStorage->getToken()->getUser();
     
                if ( ($user instanceof UserInterface) && !($user->isActiveNow()) ) {
                    $user->setLastActivityAt(new \DateTime());
                    $this->userManager->updateUser($user);
                }
            }
        }
    }
    Dans mon controller, j'ai créer un render vers ma page layout.html.twig:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    /*
    	 * @Template()
    	 */
    	public function whoIsOnlineAction()
    	{
    		$users = $this->getDoctrine()->getManager()->getRepository('App:User')->getActive();
    		//return new Response(array('users' => $users));
    		return $this->render('bundles\\FOSUserBundle\\layout.html.twig', array('users' => $users));
    		//return array('users' => $users);
    	}
    sur mon template layout.html.twig, j'ai fais appel au render et j'ai lancé une boucle pour lister tous les utilisateurs connectés:

    Code twig : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    {% extends 'base.html.twig' %}
     
    {% block content %}
    {{ render(controller('App\\Controller\\UserController:whoIsOnlineAction')) }}
    <ul>
        {% for user in users %}
        <li>{{ user.username}}</li>
        {% endfor %}
    </ul>
     
    {% endblock content %}

    Sauf que là, quand je lancer mon projet, rien ne se passe et ça tourne en boucle jusqu'au crash du serveur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Allowed memory size of 134217728 bytes exhausted (tried to allocate 774144 bytes) in C:\wamp64\www\staff-test\vendor\doctrine\orm\lib\Doctrine\ORM\AbstractQuery.php on line 435
     [ERROR] Server terminated unexpectedly.


    Je ne sais pas ou je ne vois pas encore d'où vient le problème. Quelqu'un peut m'aider?
    Sur ma base de données, je vois bien que mon champ est mis à jour après chaque activité sur le site.

  2. #2
    Membre confirmé
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2013
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Gers (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2013
    Messages : 71
    Par défaut
    Bonjour,

    Avez-vous tenté d'utiliser un subscriber ?

    Une solution pour Symfony 4 est proposée sur ce post : https://stackoverflow.com/questions/...n-active-users

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    <?php
     
    namespace App\EventSubscriber;
     
    use Symfony\Component\EventDispatcher\EventSubscriberInterface;
    use Symfony\Component\HttpKernel\KernelEvents;
    use Doctrine\ORM\EntityManagerInterface;
    use Symfony\Component\Security\Core\Security;
     
    class ActivitySubscriber implements EventSubscriberInterface {
     
        private $em;
        private $security;
     
        public function __construct(
        EntityManagerInterface $em, Security $security) {
            $this->em = $em;
            $this->security = $security;
        }
     
        public function onTerminate() {
            $user = $this->security->getUser();
     
            if (!$user->isActiveNow()) {
                $user->setLastActivityAt(new \DateTime());
                $this->em->flush($user);
            }
        }
     
        public static function getSubscribedEvents() {
            return [
                // must be registered before (i.e. with a higher priority than) the default Locale listener
                KernelEvents::TERMINATE => [['onTerminate', 20]],
            ];
        }
     
    }

  3. #3
    Membre Expert

    Homme Profil pro
    développeur
    Inscrit en
    Octobre 2013
    Messages
    1 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : développeur

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 583
    Par défaut
    Salut,

    As tu essayé de vider le cache symfony?
    Du côté des logs tu as quoi?

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/07/2011, 10h40
  2. Réponses: 0
    Dernier message: 05/05/2010, 15h27
  3. [AC-2003] Code pour afficher les utilisateurs connectés à une BDD
    Par LionelDM dans le forum IHM
    Réponses: 2
    Dernier message: 07/01/2010, 17h04
  4. Réponses: 0
    Dernier message: 24/02/2008, 18h19
  5. Afficher les utilisateurs connectés
    Par benoitL39 dans le forum SharePoint
    Réponses: 1
    Dernier message: 01/02/2008, 23h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo