От новичка до гуру: Курсы программирования на CyberDuff

Symfony 3.4: как вести журнал действий пользователя?

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

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

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

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

  • log_id
  • Логин пользователя
  • entity_id
  • действие (= "создать" или "обновить" или что-то еще)
  • дата

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

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

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


Ответы:


1

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

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

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

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

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

Удачи.

28.06.2019
  • Спасибо за ваш ответ. Gedmo Loggable кажется хорошим, но, возможно, Monolog лучше, как вы сказали, потому что он более гибкий... Я его протестирую. 28.06.2019
  • Если я помог, рассмотрите возможность голосования за мой ответ. Внизу к вашему комментарию: gedmo loggable - это расширение Doctrine (помните, что оно записывает в таблицу SQL), а Monolog - это библиотека абстракции журнала, и это совершенно разные вещи. 28.06.2019

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

    28.06.2019
  • Звучит красиво, спасибо. Я не уверен, что смогу легко найти последнее обновление для каждого объекта (например, если я хочу отобразить его внутри списков) с помощью этого метода. В любом случае буду тестить. 28.06.2019
  • Новые материалы

    Я предполагаю, что вы имеете в виду методы обработки категориальных данных.
    Я предполагаю, что вы имеете в виду методы обработки категориальных данных. Пожалуйста, проверьте мой пост Инструментарий специалиста по данным для кодирования категориальных переменных в..

    Игра в прятки с данными
    Игра в прятки с данными Я хотел бы, чтобы вы сделали мне одолжение и ответили на следующие вопросы. Гуглить можно в любое время, здесь никто не забивается. Сколько регионов в Гане? А как..

    «Раскрытие математических рассуждений с помощью Microsoft MathPrompter и моделей больших языков»
    TL;DR: MathPrompter от Microsoft показывает, как использовать математические рассуждения с большими языковыми моделями; 4-этапный процесс для улучшения доверия и рассуждений в математических..

    Раскройте свой потенциал в области разработки мобильных приложений: Абсолютная бесплатная серия
    Глава 6: Работа в сети и выборка данных Глава 1: Введение в React Native Глава 2: Основы React Native Глава 3: Создание пользовательского интерфейса с помощью React Native Глава 4:..

    Все о кейсах: Camel, Snake, Kebab & Pascal
    В программировании вы сталкивались с ними при именовании переменной, класса или функции. Поддержание согласованности типов и стилей случаев делает ваш код более читабельным и облегчает совместную..

    Как работает дистанционное парное программирование и почему оно может изменить вашу жизнь
    Серебряная пуля от одиночества и отвлекающих факторов во время обучения программированию Независимо от того, работаете ли вы или учитесь удаленно, велика вероятность, что одиночество и..

    🔥🔥👉Питон 🆚Javascript👈🔥🔥
    Сегодня Python и Javascript потрясают мир в области ИТ. Все хотят выучить Python и Javascript, чтобы получить высокооплачиваемую работу. Различные фреймворки Python и Javascript расширяют..