Symfony 3.4: как логировать историю действий пользователя? - PullRequest
1 голос
/ 28 июня 2019

Я хочу сохранить в своей базе данных все пользовательские действия, выполненные с сущностью.

Например, для 1 объекта я хочу сохранить:

  • Автор (= автор)
  • Обновлено
  • Дата создания
  • Дата обновления

Я хочу сохранить историю действий пользователя , а не последние. Я думал, что смогу создать таблицу с этими столбцами:

  • log_id
  • user_id
  • ENTITY_ID
  • action (= "создать" или "обновить" или что-то еще)
  • дата

А потом я мог легко получить последнее обновление своей сущности и отобразить дату и пользователя, который это сделал.

Существует ли пакет Symfony для этого? Должен ли я использовать Monolog? Я сделаю это для многих лиц, и я не уверен, что это правильный способ сделать ...

Можно ли создать только одну таблицу журналов для хранения каждого журнала о каждой сущности? Меня беспокоит создание 1 таблицы журналов для каждой сущности.

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Я не знаю, подойдет ли это для того, что вам нужно, но вы можете легко добавить Listener в ядро ​​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) информацию о каждой вызываемой странице. Таким образом, вы можете узнать, какое действие выполнено, зная, какой контроллер вызывается, и вы можете также записать данные запроса, чтобы вы могли узнать, какую модификацию / создание сделал пользователь.

1 голос
/ 28 июня 2019

Поскольку Doctrine основана на событиях , это просто:

  1. Либо используйте расширение, например Gedmo Loggable

  2. Или подключитесь к Событиям Doctrine и запишите, используя Monolog, все, что происходит в вашем приложении.

Лично я предпочел бы вариант 2, так как я - маньяк контроля, хотя он немного сложнее. Лично я бы также использовал Monolog, чтобы абстрагироваться от того, как и где хранятся записи журнала.

Когда вы решите, как к этому подойти, и вам по пути понадобится какая-либо помощь, задайте другой вопрос.

Удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...