custom/plugins/WydnBackendStatistic/src/Storefront/Subscriber/StorefrontRenderSubscriber.php line 46

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace WydnBackendStatistic\Storefront\Subscriber;
  3. use Doctrine\DBAL\Connection;
  4. use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository;
  5. use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria;
  6. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter;
  7. use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\MultiFilter;
  8. use Shopware\Core\Framework\Uuid\Uuid;
  9. use Shopware\Storefront\Event\StorefrontRenderEvent;
  10. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  11. class StorefrontRenderSubscriber implements EventSubscriberInterface
  12. {
  13.     /** @var EntityRepository $sessionRepository */
  14.     private EntityRepository $sessionRepository;
  15.     /** @var Connection $connection */
  16.     private Connection $connection;
  17.     /**
  18.      * @param EntityRepository $sessionRepository
  19.      * @param Connection $connection
  20.      */
  21.     public function __construct(EntityRepository $sessionRepositoryConnection $connection)
  22.     {
  23.         $this->sessionRepository $sessionRepository;
  24.         $this->connection $connection;
  25.     }
  26.     /**
  27.      * @return array[]
  28.      */
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [
  32.             StorefrontRenderEvent::class => ['onRender', -1],
  33.         ];
  34.     }
  35.     /**
  36.      * @param StorefrontRenderEvent $event
  37.      * @return void
  38.      */
  39.     public function onRender(StorefrontRenderEvent $event): void
  40.     {
  41.         // remove old sessions to avoid performance issues
  42.         $this->removeOldSessions(65); // 65 minutes
  43.         $session $event->getRequest()->getSession();
  44.         $server $event->getRequest()->server;
  45.         // exclude bots
  46.         if(empty($server->get('HTTP_USER_AGENT')) || stristr($server->get('HTTP_USER_AGENT'), 'Bot') !== false) {
  47.             return;
  48.         }
  49.         // cloudflare ip
  50.         $ip $server->get('HTTP_CF_CONNECTING_IP');
  51.         if (empty($ip)) {
  52.             // forwarded ip
  53.             $ip $server->get('HTTP_X_FORWARDED_FOR');
  54.             $ip explode(', '$ip);
  55.             $ip reset ($ip);
  56.         }
  57.         if (empty($ip)) {
  58.             // default
  59.             $ip $server->get('REMOTE_ADDR');
  60.         }
  61.         $criteria = new Criteria();
  62.         $criteria->addFilter(new MultiFilter(
  63.             MultiFilter::CONNECTION_OR,
  64.             [
  65.                 new EqualsFilter('ipHash'md5($ip)),
  66.                 new EqualsFilter('sessionId'$session->getId())
  67.             ]
  68.         ));
  69.         $sessionRequest $this->sessionRepository->search($criteria$event->getContext())->first();
  70.         $this->sessionRepository->upsert([
  71.             [
  72.                 'id' => ($sessionRequest != null $sessionRequest->getId() : Uuid::randomHex()),
  73.                 'sessionId' => $session->getId(),
  74.                 'ipHash' => md5($ip)
  75.             ]
  76.         ], $event->getContext());
  77.     }
  78.     /**
  79.      * @param int $maxTimeMinutes
  80.      * @return void
  81.      */
  82.     private function removeOldSessions(int $maxTimeMinutes 5) : void
  83.     {
  84.         try {
  85.             $this->connection->executeStatement('DELETE FROM wydn_session_request 
  86.                 WHERE (created_at < DATE_SUB(:nowDate, INTERVAL :maxTime MINUTE) AND updated_at IS NULL) OR 
  87.                       (updated_at < DATE_SUB(:nowDate, INTERVAL :maxTime MINUTE) and updated_at IS NOT NULL)', [
  88.                 'maxTime' => $maxTimeMinutes,
  89.                 'nowDate' => (new \DateTime())->format('Y-m-d H:i:s')
  90.             ]);
  91.         } catch (\Exception $e) {
  92.             // do nothing
  93.         }
  94.     }
  95. }