我想在数据库中存储有关实体的所有用户操作。
例如,对于1个实体,我要存储:
我要存储用户的操作的历史记录,而不是最后一个。我以为可以用这些列创建一个表:
然后,我可以轻松获得实体的最新更新,并显示日期和执行该操作的用户。
是否有Symfony捆绑包可以做到这一点?我应该使用Monolog吗? 我将对许多实体执行此操作,但我不确定这是否是正确的方法...
是否可以仅创建一个日志表来存储有关每个实体的每个日志?每个实体创建1个日志表很麻烦。
答案 0 :(得分:1)
由于学说是event based,因此很容易:
都使用扩展名,例如Gedmo Loggable
或者使用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的实体)中。因此,您可以通过知道调用哪个控制器来知道执行哪个操作,还可以记录请求数据,从而了解用户进行了哪些修改/创建。