src/EventSubscriber/VisitorSubscriber.php line 34

Open in your IDE?
  1. <?php
  2. // src/EventSubscriber/VisitorSubscriber.php
  3. namespace App\EventSubscriber;
  4. use App\Entity\Visitor;
  5. use Doctrine\ORM\EntityManagerInterface;
  6. use Doctrine\ORM\EntityManager;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. class VisitorSubscriber implements EventSubscriberInterface
  13. {
  14.     private EntityManagerInterface $entityManager;
  15.     private ManagerRegistry $doctrine;
  16.     public function __construct(ManagerRegistry $doctrine)
  17.     {
  18.         $this->doctrine $doctrine;
  19.         $this->entityManager $doctrine->getManager();
  20.     }
  21.     public static function getSubscribedEvents(): array
  22.     {
  23.         return [
  24.             KernelEvents::REQUEST => 'onKernelRequest',
  25.             KernelEvents::RESPONSE => 'onKernelResponse',
  26.         ];
  27.     }
  28.     public function onKernelRequest(RequestEvent $event): void
  29.     {
  30.         $request $event->getRequest();
  31.         // IP-Adresse des Besuchers
  32.         $ipAddress $request->getClientIp();
  33.         $url $request->getPathInfo();
  34.         // Liste der Pfade, die ignoriert werden sollen
  35.         $ignoredPaths = ['/vendors/''/js/''/css/''/images/''/fonts/''/_wdt''/_profiler'];
  36.         // Überprüfe, ob die URL zu einem ignorierten Pfad gehört
  37.         foreach ($ignoredPaths as $ignoredPath) {
  38.             if (strpos($url$ignoredPath) !== false) {
  39.                 return; // Überspringe das Tracking für diese URL
  40.             }
  41.         }
  42.         // Vermeide das Tracking für Admin-Seiten
  43.         if (strpos($url'/admin') !== false) {
  44.             return;
  45.         }
  46.         // Überprüfen, ob der EntityManager geschlossen ist
  47.         if (!$this->entityManager->isOpen()) {
  48.             // Hole einen neuen EntityManager über den Doctrine-Manager-Service
  49.             $this->entityManager $this->doctrine->resetManager();
  50.         }
  51.         // Suche nach einem bestehenden Besucher-Eintrag mit derselben IP-Adresse und URL
  52.         $visitor $this->entityManager->getRepository(Visitor::class)->findOneBy([
  53.             'ipAddress' => $ipAddress,
  54.             'url' => $url,
  55.         ]);
  56.         if (!$visitor) {
  57.             // Neues Besuch-Objekt erstellen, wenn kein Eintrag vorhanden ist
  58.             $visitor = new Visitor();
  59.             $visitor->setIpAddress($ipAddress);
  60.             $visitor->setUrl($url);
  61.             $visitor->setVisitedAt(new \DateTime());
  62.             $visitor->setVisitDuration(0); // Standardwert für die Besuchsdauer
  63.             $visitor->setClicks(1); // Initiale Klickzahl
  64.             $visitor->setUniqueClicks(1); // Initiale eindeutige Klickzahl
  65.             // Besuch in die Datenbank speichern
  66.             $this->entityManager->persist($visitor);
  67.         } else {
  68.             // Klick-Zähler aktualisieren
  69.             $visitor->setClicks($visitor->getClicks() + 1);
  70.         }
  71.         // Speichere die Visitor-Instanz in der Anfrage
  72.         $request->attributes->set('visitor'$visitor);
  73.         $this->entityManager->flush();
  74.     }
  75.     public function onKernelResponse(ResponseEvent $event): void
  76.     {
  77.         $request $event->getRequest();
  78.         $visitor $request->attributes->get('visitor');
  79.         if ($visitor instanceof Visitor) {
  80.             // Besuchsdauer berechnen und aktualisieren
  81.             $visitEnd = new \DateTime();
  82.             $visitDuration $visitEnd->getTimestamp() - $visitor->getVisitedAt()->getTimestamp();
  83.             $visitor->setVisitDuration($visitDuration);
  84.             $visitor->setClicks($visitor->getClicks() + 1);
  85.             $this->entityManager->flush();
  86.         }
  87.     }
  88. }