<?php
namespace App\Log\Service;
use App\Log\Entity\Log;
use App\Log\Entity\Request;
use App\Log\EventSubscriber\RequestSubscriber;
use App\Security\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class LogFactory {
/**
* @var EntityManagerInterface
*/
protected EntityManagerInterface $entityManager;
/**
* @var RequestStack
*/
protected RequestStack $requestStack;
/**
* @var TokenStorageInterface
*/
protected TokenStorageInterface $tokenStorage;
public function __construct(EntityManagerInterface $logEntityManager,
RequestStack $requestStack,
TokenStorageInterface $tokenStorage)
{
$this->entityManager = $logEntityManager;
$this->requestStack = $requestStack;
$this->tokenStorage = $tokenStorage;
}
/**
* Creates new log for current request
* @param int $severity
* @param string $subject
* @param array $data
* @param string $type
* @param Request|null $requestEntity
*/
public function log(int $severity, string $subject, array $data, string $type = Log::TYPE_COMMON, Request $requestEntity = null): void
{
$log = (new Log())->setSeverity($severity)
->setData($data)
->setSubject($subject)
->setType($type);
$user = $this->tokenStorage->getToken() ? $this->tokenStorage->getToken()->getUser() : null;
if ($user instanceof User && $this->tokenStorage->getToken()){
$log->setUser($this->entityManager->getRepository(User::class)->find($user->getId()));
}
if(!$requestEntity && $request = $this->requestStack->getMainRequest()) {
$requestEntity = $request->attributes->get(RequestSubscriber::ID_KEY);
}
if($requestEntity) {
$log->setRequest($requestEntity);
}
$this->entityManager->persist($log);
$this->entityManager->flush();
}
}