Symfony how to return all logged in Active Users

前端 未结 5 2045
-上瘾入骨i
-上瘾入骨i 2020-12-05 01:31

I want to return all Logged in users of my application and render it in my Dashboard. The user_id and user_name should be retrieve

5条回答
  •  盖世英雄少女心
    2020-12-05 02:06

    There is a great post here: List online users.

    You can create a Listener that listens on the kernel.controller event and updates a user field lastActivity every time a user is active. You can check lastActivity < now()- 2 minutes and update lastActivity timestamp.

    Also: Implementing user activity in symfony 2

    Here is how to do it

    Note: If you're not using FOSUserBundle, see Edit below.

    1 Add this to your User Entity

    /**
     * Date/Time of the last activity
     *
     * @var \Datetime
     * @ORM\Column(name="last_activity_at", type="datetime")
     */
    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 );
    }
    

    2 Create Event Listener

    securityContext = $securityContext;
            $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->securityContext->getToken()) {
                $user = $this->securityContext->getToken()->getUser();
    
                if ( ($user instanceof UserInterface) && !($user->isActiveNow()) ) {
                    $user->setLastActivityAt(new \DateTime());
                    $this->userManager->updateUser($user);
                }
            }
        }
    }
    

    3 Declare event Listener as a service

    parameters:
        acme_user.activity_listener.class: Acme\UserBundle\EventListener\ActivityListener
    
    services:
        acme_user.activity_listener:
            class: %acme_user.activity_listener.class%
            arguments: [@security.context, @fos_user.user_manager]
            tags:
                - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }
    

    And you're good to go!

    Edit (without FOSUserBundle)

    1 Add this to your User Entity

    Same as Step 1 Above
    

    2 Create Event Listener

    securityContext = $securityContext;
            $this->entityManager = $entityManager;
        }
    
        /**
        * 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->securityContext->getToken()) {
                $user = $this->securityContext->getToken()->getUser();
    
                if ( ($user instanceof User) && !($user->isActiveNow()) ) {
                    $user->setLastActivityAt(new \DateTime());
                    $this->entityManager->flush($user);
                }
            }
        }
    }
    

    3 Declare event Listener as a service

    parameters:
        acme_user.activity_listener.class: Acme\UserBundle\EventListener\ActivityListener
    
    services:
        acme_user.activity_listener:
            class: %acme_user.activity_listener.class%
            arguments: [@security.context, @doctrine.orm.entity_manager]
            tags:
                - { name: kernel.event_listener, event: kernel.controller, method: onCoreController }
    

    And you're good to go!

提交回复
热议问题