<?php
namespace App\EventListener;
use App\Component\Authenticator\Authenticator;
use App\Entity\Log;
use App\Repository\WorkspaceRepository;
use App\Repository\UserRepository;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
class Logger
{
/**
* @var EntityManagerInterface
*/
private $entityManager;
/**
* @var Authenticator
*/
private $authenticator;
/**
* @var WorkspaceRepository
*/
private $workspaceRepository;
function __construct(EntityManagerInterface $entityManager, Authenticator $authenticator, WorkspaceRepository $workspaceRepository)
{
$this->entityManager = $entityManager;
$this->authenticator = $authenticator;
$this->workspaceRepository = $workspaceRepository;
}
/**
* Logging events to the database before controller execution.
*
* @param ControllerEvent $event
*
* @throws Exception
*/
public function onKernelController(ControllerEvent $event)
{
$request = $event->getRequest();
$uri = $request->getRequestUri();
if (strpos($uri, '/_wdt/') !== false || strpos($uri, '/api/v1/auth/login') !== false || !$this->authenticator->isAuthenticated()) {
return;
}
$user = $this->authenticator->getUser();
$log = new Log();
if($user) {
$workspace = $this->workspaceRepository->find($this->authenticator->getSessionWorkspace()->getId());
$log->setWorkspace($workspace);
$log->setUser($user);
}
$log->setEndpoint($uri);
$log->setMethod($request->getMethod());
$log->setData($request->getContentType() ? $request->getContent() : null);
$this->entityManager->persist($log);
$this->entityManager->flush();
}
}