src/EventListener/UserStatsListener.php line 204
- <?php
- namespace App\EventListener;
- use App\Entity\User;
- use App\Entity\UserStats;
- use App\Event\BookingCompleteEvent;
- use App\Event\OrderCompleteEvent;
- use App\Services\IPGeolocator;
- use Doctrine\Common\Persistence\ObjectManager;
- use Doctrine\ORM\EntityManager;
- use Psr\Log\LoggerInterface;
- use Ramsey\Uuid\Uuid;
- use Doctrine\ORM\EntityManagerInterface;
- use Symfony\Component\HttpFoundation\Request;
- use Symfony\Component\HttpFoundation\Session\Session;
- use Symfony\Component\HttpKernel\Event\KernelEvent;
- // use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorage;
- use Symfony\Component\Security\Core\Authentication\Token\Storage\UsageTrackingTokenStorage;
- use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
- class UserStatsListener
- {
- /**
- * @var EntityManager $em
- */
- protected $em;
- /**
- * @var Session $session
- */
- protected $session;
- /**
- * @var IPGeolocator $locator
- */
- protected $locator;
- /**
- * @var User $user
- */
- protected $user;
- /**
- * @var LoggerInterface
- */
- protected $logger;
- /**
- * UserStatsListener constructor.
- * @param Session $session
- * @param ObjectManager $em
- * @param IPGeolocator $locator
- * @param TokenStorage $storage
- * @param LoggerInterface $logger
- */
- public function __construct(Session $session, EntityManagerInterface $em, IPGeolocator $locator, UsageTrackingTokenStorage $storage, LoggerInterface $logger)
- {
- $this->em = $em;
- $this->session = $session;
- $this->locator = $locator;
- $this->user = null;
- $this->logger = $logger;
- if (!is_null($token = $storage->getToken())) {
- $this->user = $storage->getToken()->getUser();
- }
- }
- /**
- * @param Request $request
- * @return mixed
- */
- protected function getPage(Request $request)
- {
- return str_replace('app_dev.php', '', $request->getRequestUri());
- }
- /**
- * @param $sessionId
- * @param $uuid
- * @return UserStats|null
- */
- protected function findUserStats($sessionId, $uuid)
- {
- return $this->em->getRepository(UserStats::class)->findOneBySessionIdOrUuid($sessionId, $uuid);
- }
- /**
- * @param Request $request
- * @param string $sessionId
- * @param string $uuid
- * @return UserStats
- */
- protected function createUserStats(Request $request, $sessionId, $uuid)
- {
- $userStats = new UserStats();
- $userStats->setSessionId($sessionId);
- $userStats->setIp($request->getClientIp());
- $userStats->setDevice($request->headers->get('USER-AGENT'));
- $userStats->setReferer($request->headers->get('referer'));
- $userStats->setUuid($uuid);
- /**
- * GeoLocation
- */
- $location = $this->locator->geoLocate($request->getClientIp());
- if (is_array($location)) {
- $userStats->setLocation($location);
- }
- return $userStats;
- }
- /**
- * @return string
- */
- protected function getSessionUuid()
- {
- if (!$this->session->has('uuid')) {
- $this->session->set('uuid', Uuid::uuid4());
- }
- return $this->session->get('uuid');
- }
- /**
- * Should we track the request?
- * @param KernelEvent $event
- * @return bool
- */
- protected function isValidRequest(KernelEvent $event)
- {
- $request = $event->getRequest();
- /**
- * List of not traceable requests
- */
- if (!$event->isMainRequest() || //SubRequest
- $request->isXmlHttpRequest() || //Ajax
- strpos($request->attributes->get('_route'), 'assetic') !== false || //Assetic
- strpos('/_', $request->getRequestUri()) !== false //Hidden url
- ) {
- return false;
- }
- return true;
- }
- /**
- * @param KernelEvent $event
- * @return bool
- */
- public function onKernelRequest(KernelEvent $event)
- {
- try {
- if ($this->isValidRequest($event)) {
- $request = $event->getRequest();
- if ($sessionId = $this->session->getId()) {
- $uuid = $this->getSessionUuid();
- if (!$userStats = $this->findUserStats($sessionId, $uuid)) {
- $userStats = $this->createUserStats($request, $sessionId, $uuid);
- }
- $userStats->setLastUpdate(new \DateTime());
- $userStats->addVisitedPage($this->getPage($request));
- $userStats->setUser($this->user);
- $userStats->setLocale($request->getLocale());
- $this->em->persist($userStats);
- $this->em->flush();
- }
- return true;
- }
- return false;
- } catch (\Exception $e) {
- $this->logger->error('ERROR TRAKING STATS FROM THE USER : ' . $e->getMessage() . "[{$e->getTraceAsString()}]");
- }
- return false;
- }
- /**
- * @param OrderCompleteEvent $event
- */
- public function onOrderComplete(OrderCompleteEvent $event)
- {
- $order = $event->getOrder();
- $request = $event->getRequest();
- if ($sessionId = $this->session->getId()) {
- $uuid = $this->getSessionUuid();
- if (!$userStats = $this->findUserStats($sessionId, $uuid)) {
- $this->createUserStats($request, $sessionId, $uuid);
- }
- $userStats->addOrderConversion($order);
- $this->em->persist($userStats);
- $this->em->flush();
- }
- }
- /**
- * @param BookingCompleteEvent $event
- */
- public function onBookingComplete(BookingCompleteEvent $event)
- {
- $booking = $event->getBooking();
- $request = $event->getRequest();
- if ($sessionId = $this->session->getId()) {
- $uuid = $this->getSessionUuid();
- if (!$userStats = $this->findUserStats($sessionId, $uuid)) {
- $this->createUserStats($request, $sessionId, $uuid);
- }
- $userStats->addBookingConversion($booking);
- $this->em->persist($userStats);
- $this->em->flush();
- }
- }
- }