<?php
namespace App\EventListener;
use App\Entity\Log;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Persistence\AbstractManagerRegistry;
use Exception;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Security\Core\Security;
use Throwable;
class KernelRequestListener
{
public function __construct(
private Security $security,
private KernelInterface $kernel,
private EntityManagerInterface $em,
private LoggerInterface $logger
){}
public function onKernelRequest(RequestEvent $event)
{
try {
$this->logger->debug("Start ".__function__." ".__class__);
$log = new Log();
$request = $event->getRequest()->request->All();
$query = $event->getRequest()->query->All();
$headers = $event->getRequest()->headers->All();
$user = $this->security->getUser();
$log->setUser($user?->getUserIdentifier()??'anonymous');
$log->setRoles($user?->getRoles());
$log->setMethod($event->getRequest()->server->get('REQUEST_METHOD'));
$log->setWebservice($event->getRequest()->attributes->get("_route"));
$log->setUri($event->getRequest()->server->get('PATH_INFO'));
$log->setRequest($request);
$log->setHeaders($headers);
$log->setQuery($query);
$log->setReferer($event->getRequest()->server->get('HTTP_REFERER'));
$log->setServerName($event->getRequest()->server->get('SERVER_NAME'));
$log->setServerAddr($event->getRequest()->server->get('SERVER_ADDR'));
$log->setUserAgent($event->getRequest()->server->get('HTTP_USER_AGENT'));
$log->setRemoteAddr($event->getRequest()->server->get('REMOTE_ADDR'));
$this->em->persist($log);
$this->em->flush();
}
catch (Throwable $e)
{
if (!$this->em->isOpen()) {
$this->em = $GLOBALS['app']->getContainer()->get('doctrine')->resetManager();
}
$this->logger->error("ERROR H-".uniqid().": {$e->getMessage()} file {$e->getFile()}:{$e->getLine()}. Trace: {$e->getTraceAsString()}");
//if ($this->kernel->getEnvironment() === "dev") throw $e;
}
catch (Exception $e)
{
if (!$this->em->isOpen()) {
$this->em = $GLOBALS['app']->getContainer()->get('doctrine')->resetManager();
}
$this->logger->error("ERROR H-".uniqid().": {$e->getMessage()} file {$e->getFile()}:{$e->getLine()}. Trace: {$e->getTraceAsString()}");
//if ($this->kernel->getEnvironment() === "dev") throw $e;
}
finally
{
$this->logger->debug("End ".__function__." ".__class__);
}
}
}