2017-09-18 33 views

回答

0

您可以通過收聽security.interactive_login活動保存登錄日期和時間。這是你應該怎麼做的。

爲同創建服務:

app.authentication_success_handler: 
    class: AppBundle\EventListener\AuthenticationSuccessHandler 
    arguments: ['@doctrine.orm.entity_manager', '@router'] 
    tags: 
     - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin } 

請注意:您在參數傳遞entity_manager因爲你會需要它來更新數據庫。

接下來創建一個類,以調用服務:

class AuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface 
{ 
    /** 
    * @var type 
    */ 
    private $em; 

    /** 
    * @var type 
    */ 
    private $router; 


    public function __construct(EntityManager $em = null, Router $router) 
    { 
     $this->em = $em; 
     $this->router = $router; 
    } 

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) 
    { 
     $token = $event->getAuthenticationToken(); 
     $request = $event->getRequest(); 

     $this->onAuthenticationSuccess($request, $token); 
    } 

    /** 
    * @param Request $request 
    * @param TokenInterface $token 
    * @return RedirectResponse 
    */ 
    public function onAuthenticationSuccess(Request $request, TokenInterface $token) 
    { 
     $path = "_security.main.target_path"; 
     $session = $request->getSession(); 

     $referrer = $this->router->generate('homepage'); // default redirect path. 

     // Handle gated content, if user has accessed before login, 
     if ($session->get($path)) { 
      $referrer = $session->get($path); 
     } 
     $user = $token->getUser(); 

     // ############## Do database update here. Since you have access to User Object($user) and Entity manager($this->em). 
     $dateTime = new \DateTime(); 
     $user->setLoginTime($dateTime); 
     $this->em->flush(); 

     return new RedirectResponse($referrer); 
    } 
} 

這應該保存登錄時間工作。

辦理註銷時間:

你可以這樣做,通過實施LogoutHandlerInterface並添加處理您的安全配置。

創建服務:

app.logout_handler: 
    class: AppBundle\EventListener\LogoutListener 
    arguments: ['@doctrine.orm.entity_manager', '@router'] 

現在,確保當用戶註銷時,該服務將被調用。現在

// security.yml 
security: 
    firewalls: 
     main: 
      logout: 
       handlers: [app.logout_handler] 

您可以創建另一個類AppBundle\EventListener\LogoutListener 應實行LogoutHandlerInterface並保存用戶信息,像我們做的app.authentication_success_handler

雖然我還沒有測試過。但它應該工作。

希望它有幫助!

+0

你可以在答案中分享註銷的控制器方法嗎?這樣它將成爲問題的完整答案,我可以將其標記爲已回答。 – serializer

+0

嗨,似乎有一種方法可以通過處理程序保存註銷時間。我已經編輯了我的答案。請檢查一次。 – Jeet

+0

謝謝Brodie ... :) – serializer

相關問題