Symfony 3.4:如何记录用户操作的历史记录?

时间:2019-06-28 10:45:35

标签: mysql symfony logging symfony-3.4 user-activity

我想在数据库中存储有关实体的所有用户操作。

例如,对于1个实体,我要存储:

  • 由(=作者)创建
  • 更新人
  • 创建日期
  • 更新日期

我要存储用户的操作的历史记录,而不是最后一个。我以为可以用这些列创建一个表:

  • log_id
  • user_id
  • entity_id
  • 操作(=“创建”或“更新”或其他内容)
  • 日期

然后,我可以轻松获得实体的最新更新,并显示日期和执行该操作的用户。

是否有Symfony捆绑包可以做到这一点?我应该使用Monolog吗? 我将对许多实体执行此操作,但我不确定这是否是正确的方法...

是否可以仅创建一个日志表来存储有关每个实体的每个日志?每个实体创建1个日志表很麻烦。

2 个答案:

答案 0 :(得分:1)

由于学说是event based,因此很容易:

  1. 都使用扩展名,例如Gedmo Loggable

  2. 或者使用Monolog挂接到Doctrine's events并登录,记录应用程序中发生的所有事情。

就我个人而言,我更喜欢选项2,因为我是一名控制狂,但它要复杂一些。我个人也将使用Monolog,以便抽象出日志条目的存储方式和存储方式。

当您决定如何处理此问题时,在此过程中将需要任何帮助,请提出另一个问题。

祝你好运。

答案 1 :(得分:1)

我不知道这是否满足您的需求,但是您可以轻松地向symfony内核添加一个Listener来记录使用的每个控制器。

类似这样的东西:

class UserLogListener {

    protected $authChecker;
    protected $tokenStorage;
    protected $entityManager;

    public function __construct(TokenStorageInterface  $tokenStorage, AuthorizationChecker $authChecker, EntityManager $entityManager)
    {
        $this->authChecker = $authChecker;
        $this->tokenStorage = $tokenStorage;
        $this->entityManager = $entityManager;

    }

    public function onKernelRequest(GetResponseEvent $event)
    {
        if( $this->tokenStorage->getToken() != null){
            $user = $this->tokenStorage->getToken()->getUser();
            $currentDate = new \Datetime();
            $action = $event->getRequest()->attributes->get('_controller');
            $method =  $event->getRequest()->getMethod();
            $userIp =  $event->getRequest()->getClientIp();
            $userLogRepository = $this->entityManager->getRepository(UserLog::class);

            if($user instanceof User){
                $userLog = new UserLog();
                $userLog->setUser($user);
                $userLog->setIp($userIp);
                $userLog->setAction($action);
                $userLog->setMethode($method);
                $userLog->setDate($currentDate);
                if($event->getRequest()->request && $methode=='POST'){
                    $userLog->setData(json_encode($event->getRequest()->request->all()));
                }else{
                    $userLog->setData($event->getRequest()->getPathInfo());
                }
                $this->entityManager->persist($userLog);
                $this->entityManager->flush();
            }
        }

    }
}

它的作用是将有关每个调用页面的信息添加到数据库(带有一个名为UserLog的实体)中。因此,您可以通过知道调用哪个控制器来知道执行哪个操作,还可以记录请求数据,从而了解用户进行了哪些修改/创建。