1

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

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

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

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

  • log_id
  • 用户身份
  • entity_id
  • 动作(=“创建”或“更新”或其他)
  • 日期

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

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

是否可以只创建一个日志表来存储有关每个实体的每个日志?每个实体创建 1 个日志表让我很困扰。

4

2 回答 2

2

由于 Doctrine 是基于事件的,因此很容易:

  1. 使用扩展程序,例如Gedmo Loggable

  2. 或者挂钩到Doctrine 的事件并使用 Monolog 记录您的应用程序中发生的所有事情。

我个人更喜欢选项 2,因为我是一个控制狂,虽然它有点复杂。就我个人而言,我也会使用 Monolog,这样我就可以抽象出日志条目的存储方式和存储位置。

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

祝你好运。

于 2019-06-28T10:49:55.297 回答
2

我不知道这是否符合你的需要,但你可以很容易地在 symfony 内核中添加一个监听器来记录每个使用的控制器。

像这样的东西:

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 的实体)。因此,您可以通过知道调用哪个控制器来知道执行了哪个操作,并且您还可以记录请求数据,以便找出用户进行了哪些修改/创建。

于 2019-06-28T11:31:20.203 回答