1

我正在使用 Symfony2 编写一个 Web 应用程序,我需要注册每个登录该应用程序的用户的最后访问权限。我的实体有一个last_access属性,类型为 datetime。

代码很简单,我只需要获取当前用户的实体并设置值,但我不知道该把代码放在哪里。

我在想这样的事情:

$manager = $this->getDoctrine()->getManager();
$user= $this->get('security.context')->getToken()->getUser();
$user->setLastAccess(new \DateTime('now'));
$manager->persist($user);
$manager->flush();

更新

我使用事件侦听器解决了这个问题。

class LoginListener {
/**
 * @var Doctrine\Bundle\DoctrineBundle\Registry
 */
private $doctrine;

public function __construct(Doctrine $doctrine){
    $this->doctrine = $doctrine;
}

public function onInteractiveLogin(InteractiveLoginEvent $event){
    $user = $event->getAuthenticationToken()->getUser();

    if ($user) {
        $user->setLastAccess(new \DateTime('now'));
        $this->doctrine->getEntityManager()->persist($user);
        $this->doctrine->getEntityManager()->flush();
    }
}

}

我还创建了一个服务:

services:
my.service:
    class: SGRH\AdminBundle\Listener\LoginListener
    arguments: [@doctrine]
    tags:
      - { name: kernel.event_listener, event: security.interactive_login, method: onInteractiveLogin }

谢谢大家!

4

4 回答 4

1

您可以使用服务来执行此操作,在登录时调用事件“security.interactive_login”。

因此,如果您将 YML 用于服务:

your_user_bundle.security.interactive_login_listener:
    class: ACME\YourBundle\Listener\InteractiveLoginListener
    arguments: [ "@doctrine.orm.entity_manager", "@request" ]
    scope: request
    tags:
      - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin } 

和班级:

<?php

namespace ACME\YourBundle\Listener;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

use Doctrine\ORM\EntityManager;
use ACME\YourBundle\Entity\User;

class InteractiveLoginListener {

    protected $em;
    protected $request;

    public function __construct(EntityManager $em, Request $request) {

        $this->em = $em;
        $this->request = $request;
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {

        $user = $event->getAuthenticationToken()->getUser();

        if ($user instanceof User) {
            if($this->request->hasSession()) {
                $user->setLastAccess(new \DateTime('now'));
                $this->em->persist($user);
                $this->em->flush();
            }
        }
    }
}
于 2013-09-21T21:09:52.430 回答
1

以防万一有人想要这个用于更新版本的 symfony,这里是它的代码。一些事情发生了变化,即不再有 Request,现在您使用 RequestStack。

services.yml 文件

 app.security.interactive_login_listener:
      class: AppBundle\Security\InteractiveLoginListener
      arguments: ["@doctrine.orm.entity_manager", "@request_stack" ]
      scope: request
      tags:
        - { name: kernel.event_listener, event: security.interactive_login, method: onSecurityInteractiveLogin }

还有这个类(请注意,我使用的是 AppBundle 而不是我自己的自定义包。

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;

use Doctrine\ORM\EntityManager;
use AppBundle\Entity\User;

class InteractiveLoginListener {

    protected $em;
    protected $request;

    public function __construct(EntityManager $em, RequestStack $request) {

        $this->em = $em;
        $this->request = $request;
    }

    public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) {

        $user = $event->getAuthenticationToken()->getUser();

        if ($user instanceof User) {
            if($this->request->getCurrentRequest()->hasSession()) {
                $user->setLast_Login(new \DateTime('now'));
                $this->em->persist($user);
                $this->em->flush();
            }
        }
    }
}
于 2017-02-16T19:31:50.693 回答
0

通常,您将当前用户信息(如 Id、用户名..等)保存在 cookie 或会话中。只需调用它并对数据库进行查询并将当前日期时间添加到数据库中的列中即可。

例如

Update Last_session = 'Current datetime'
Where UserID = 'UserID gotten form cookie/session'
From db.user;
于 2013-09-21T11:31:10.093 回答
0

在 symfony2 中,您可以使用学说扩展。它提供了 Translatable、Sluggable、Tree-NestedSet、Timestampable、Loggable、Sortable 等功能。

https://github.com/l3pp4rd/DoctrineExtensions

我希望这能帮到您

于 2013-09-21T16:45:23.673 回答