<?php
namespace App\Event;
use App\Entity\ErrorLog;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpKernel\Profiler\Profiler;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
class ExceptionListener
{
private $entityManager;
private $tokenStorage;
public function __construct(EntityManagerInterface $entityManager, TokenStorageInterface $tokenStorage, Profiler $profiler)
{
$this->entityManager = $entityManager;
$this->tokenStorage = $tokenStorage;
$this->profiler = $profiler;
}
public function onKernelException(ExceptionEvent $event)
{
// Récupérer l'exception
$exception = $event->getThrowable();
// dump($this->profiler->get('security'));exit;
// Vérifie s'il s'agit d'une exception HTTP
// Initialiser le code d'état
$statusCode = 500; // Par défaut pour les erreurs non gérées
// Vérifie s'il s'agit d'une exception HTTP (comme 404)
if ($exception instanceof HttpExceptionInterface) {
$statusCode = $exception->getStatusCode();
}
// Filtre pour capturer les erreurs 404 et 500
if ($statusCode === 404 || $statusCode === 500) {
// Récupérer l'utilisateur courant, s'il est connecté
$token = $this->tokenStorage->getToken();
$user = $token ? $token->getUser() : null;
$username = $user ? $user->getUsername() : 'Anonymous';
$userId = $user ? $user->getId() : 0;
// Récupérer l'URL de la requête
$url = $event->getRequest()->getUri();
// Vérifier si l'erreur existe déjà dans la base pour cette URL et ce code de statut
$existingError = $this->entityManager->getRepository(ErrorLog::class)
->findOneBy([
'url' => $url,
'message' => $exception->getMessage(),
'userid' => $userId,
'typeerror' => $statusCode
]);
if ($existingError) {
// Si l'erreur existe déjà, ne rien faire
return;
}
// Créer une nouvelle entrée d'erreur pour la base de données
$error = new ErrorLog();
$error->setMessage($exception->getMessage());
$error->setDatelog(new \DateTime());
$error->setUserid($userId);
$error->setUsername($username);
$error->setUrl($url);
$error->setTypeerror($statusCode);
// Sauvegarder l'erreur dans la base de données
$this->entityManager->persist($error);
$this->entityManager->flush();
}
}
}