src/EventSubscriber/KernelControllerSubscriber.php line 155

Open in your IDE?
  1. <?php
  2. namespace Slivki\EventSubscriber;
  3. use Doctrine\ORM\EntityManagerInterface;
  4. use Slivki\Controller\SiteController;
  5. use Slivki\Entity\MailingCampaign;
  6. use Slivki\Entity\MailingStatistic;
  7. use Slivki\Entity\Seo;
  8. use Slivki\Entity\User;
  9. use Slivki\Enum\Order\Domain;
  10. use Slivki\Services\City\CityCacheService;
  11. use Slivki\Services\City\CityProvider;
  12. use Slivki\Services\MailingCampaign\Partner\PartnerMailingCampaignClickHandler;
  13. use Slivki\Util\Amplitude;
  14. use Slivki\Util\CommonUtil;
  15. use Slivki\Entity\City;
  16. use Slivki\Util\Iiko\BurgerKing;
  17. use Slivki\Util\Iiko\Crabs;
  18. use Slivki\Util\Iiko\DinnerBuffet;
  19. use Slivki\Util\Iiko\Dodo;
  20. use Slivki\Util\Iiko\Dominos;
  21. use Slivki\Util\Iiko\PirogiBy;
  22. use Slivki\Util\Iiko\Pirogovaya1;
  23. use Slivki\Util\Iiko\Shtolle;
  24. use Slivki\Util\Iiko\SushiChefArts;
  25. use Slivki\Util\Iiko\SushiVesla;
  26. use Slivki\Util\Iiko\Urbanfood;
  27. use Slivki\Util\Iiko\WokiToki;
  28. use Slivki\Util\SoftCache;
  29. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  30. use Symfony\Component\HttpFoundation\Cookie;
  31. use Symfony\Component\HttpFoundation\RedirectResponse;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\HttpFoundation\Response;
  34. use Symfony\Component\HttpKernel\Event\RequestEvent;
  35. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  36. use Symfony\Component\HttpKernel\KernelEvents;
  37. final class KernelControllerSubscriber implements EventSubscriberInterface
  38. {
  39.     private const PATTERNS_FOR_NOT_REDIRECT = [
  40.         'delivery',
  41.         'gift-certificate',
  42.         'login',
  43.         'api/online-order/',
  44.     ];
  45.     private array $allowedSubdomains = [
  46.         'tokiny',
  47.         'sushihouse',
  48.         'm',
  49.         'marketplace',
  50.         'okpirog',
  51.         SushiChefArts::DOMAIN,
  52.         'citysushi',
  53.         'tuna',
  54.         'fsushi',
  55.         'moresushi',
  56.         '73',
  57.         WokiToki::DOMAIN,
  58.         DinnerBuffet::DOMAIN,
  59.         Dominos::DOMAIN,
  60.         'sushi-master',
  61.         'mp',
  62.         PirogiBy::DOMAIN,
  63.         Pirogovaya1::DOMAIN,
  64.         BurgerKing::DOMAIN,
  65.         Crabs::DOMAIN,
  66.         'deka',
  67.         Shtolle::DOMAIN,
  68.         Dodo::DOMAIN,
  69.         'whitelotus',
  70.         'marsel',
  71.         'shah',
  72.         'avokado',
  73.         'express-pizza',
  74.         'heropark',
  75.         'thesushi',
  76.         SushiVesla::DOMAIN,
  77.         Urbanfood::DOMAIN,
  78.         'profisushi',
  79.         'artsushi',
  80.         'byrolls',
  81.         'ajia',
  82.         'jasmin',
  83.         'ustrica',
  84.         'pastadeli',
  85.         Domain::OUSHEN,
  86.         'sea',
  87.         'wineseafood',
  88.         'izumi',
  89.         'delyga',
  90.     ];
  91.     private array $placeHolderDomains = [];
  92.     private $baseDomain;
  93.     private EntityManagerInterface $entityManager;
  94.     private CityCacheService $cityCacheService;
  95.     private PartnerMailingCampaignClickHandler $partnerMailingCampaignClickHandler;
  96.     private CityProvider $cityProvider;
  97.     public function __construct(
  98.         EntityManagerInterface $entityManager,
  99.         CityCacheService $cityCacheService,
  100.         PartnerMailingCampaignClickHandler $partnerMailingCampaignClickHandler,
  101.         CityProvider $cityProvider,
  102.         string $baseDomain
  103.     ) {
  104.         $this->baseDomain $baseDomain;
  105.         $this->entityManager $entityManager;
  106.         $this->cityCacheService $cityCacheService;
  107.         $this->partnerMailingCampaignClickHandler $partnerMailingCampaignClickHandler;
  108.         $this->cityProvider $cityProvider;
  109.     }
  110.     public static function getSubscribedEvents(): array
  111.     {
  112.         return [
  113.             KernelEvents::REQUEST => ['onKernelRequest'33],
  114.             KernelEvents::RESPONSE => ['onKernelResponse'33]
  115.         ];
  116.     }
  117.     public function onKernelRequest(RequestEvent $event): void
  118.     {
  119.         if (!$event->isMainRequest()) {
  120.             return;
  121.         }
  122.         $request $event->getRequest();
  123.         $pathInfo $request->getPathInfo();
  124.         $hostExploded explode('.'$request->getHost());
  125.         $subDomain $hostExploded[0];
  126.         if ($subDomain === 'delyga') {
  127.             return;
  128.         }
  129.         if (\in_array($subDomain$this->allowedSubdomainstrue) && !$this->isIncludedToRoute($pathInfo)) {
  130.             $event->setResponse(new RedirectResponse(
  131.                 \sprintf(
  132.                     'https://%s%s%s',
  133.                     $request->getSession()->get(City::CITY_DOMAIN_SESSION_KEY'www'),
  134.                     $this->baseDomain,
  135.                     $pathInfo,
  136.                 ),
  137.                 Response::HTTP_TEMPORARY_REDIRECT,
  138.             ));
  139.             return;
  140.         }
  141.         $cityID $this->cityProvider->getDefaultCityId();
  142.         $request->getSession()->set(City::CITY_ID_SESSION_KEY$cityID);
  143.         if (!in_array($subDomain$this->allowedSubdomainstrue)) {
  144.             if ('' !== $subDomain && 'www' !== $subDomain) {
  145.                 $subDomainCityId $this->cityCacheService->getCityIdByDomain($subDomain);
  146.                 if (null === $subDomainCityId) {
  147.                     $event->setResponse(new RedirectResponse($this->baseDomain $pathInfo302));
  148.                 } else {
  149.                     $cityID $subDomainCityId;
  150.                 }
  151.             }
  152.             $request->getSession()->set(City::CITY_ID_SESSION_KEY$cityID);
  153.             $request->getSession()->set(City::CITY_DOMAIN_SESSION_KEY$subDomain);
  154.             if (City::DEFAULT_CITY_ID === $cityID && 'www' !== $subDomain) {
  155.                 $event->setResponse(new RedirectResponse('https://www' $this->baseDomain301));
  156.                 return;
  157.             }
  158.         }
  159.         $this->saveMailingStatistic($request);
  160.         $this->partnerMailingCampaignClickHandler->handle($request);
  161.         $seoRepository $this->entityManager->getRepository(Seo::class);
  162.         $metaInfo $seoRepository->getByAlias($pathInfo$subDomain$this->baseDomain);
  163.         if (isset($this->placeHolderDomains[$subDomain])) {
  164.             $request->attributes->set('_controller'"Slivki\\Controller\\DefaultController::domainPlaceHolderAction");
  165.             $request->attributes->set("entityID"$this->placeHolderDomains[$subDomain]);
  166.             return;
  167.         }
  168.         if ($metaInfo && $metaInfo != SoftCache::EMPTY_VALUE) {
  169.             $exploded explode(':'$metaInfo->getResourceURL());
  170.             $url "Slivki\\Controller\\" $exploded[1] . "Controller::" $exploded[2] . 'Action';
  171.             $request->attributes->set('_controller'$url);
  172.             $request->attributes->set("entityID"$metaInfo->getEntityID());
  173.             $request->attributes->set(SiteController::PARAMETER_META_INFO$metaInfo);
  174.             if (!$metaInfo->isActive() && !in_array($subDomain$this->allowedSubdomains)) {
  175.                 $redirectURL $metaInfo->getRedirectURL();;
  176.                 if ($request->query->count()) {
  177.                     $parameters = [];
  178.                     foreach ($request->query->all() as $key => $value) {
  179.                         $parameters[] = $key '=' $value;
  180.                     }
  181.                     $redirectURL .= '?' implode('&'$parameters);
  182.                 }
  183.                 $event->setResponse(new RedirectResponse($redirectURL301));
  184.             }
  185.         }
  186.     }
  187.     public function onKernelResponse(ResponseEvent $event) {
  188.         $refID $event->getRequest()->query->get('ref');
  189.         if ($refID) {
  190.             $cookie Cookie::create('refID'$refID, new \DateTime('+1 month'));
  191.             $event->getResponse()->headers->setCookie($cookie);
  192.         }
  193.     }
  194.     private function saveMailingStatistic(Request $request) {
  195.         $query $request->query;
  196.         $mailingCampaignID $query->getInt('utm_campaign');
  197.         $userID $query->getInt('utm_b');
  198.         $entityID $query->getInt('utm_c');
  199.         $entityType $query->getInt('utm_d');
  200.         $entityManager $this->entityManager;
  201.         // Рассылка с бонусом для Могилева
  202.         if ($mailingCampaignID == 1041 && $userID) {
  203.             $user $entityManager->find(User::class, $userID);
  204.             if (!$user) {
  205.                 return;
  206.             }
  207.             if ($entityManager->getRepository(User::class)->setMogilevMailingBonus($user)) {
  208.                 $request->getSession()->getFlashBag()->add('showMogilevMailingBonusPopup''1');
  209.             }
  210.             return;
  211.         }
  212.         // Рассылка с бонусом для Гомеля
  213.         if ($mailingCampaignID == 1042 && $userID) {
  214.             $user $entityManager->find(User::class, $userID);
  215.             if (!$user) {
  216.                 return;
  217.             }
  218.             if ($entityManager->getRepository(User::class)->setGomelMailingBonus($user)) {
  219.                 $request->getSession()->getFlashBag()->add('showMogilevMailingBonusPopup''1');
  220.             }
  221.             return;
  222.         }
  223.         if (!$mailingCampaignID || !$entityType || !$entityID) {
  224.             return;
  225.         }
  226.         $mailingCampaign $entityManager->find(MailingCampaign::class, $mailingCampaignID);
  227.         if (!$mailingCampaign) {
  228.             return;
  229.         }
  230.         $mailingStatistic = new MailingStatistic();
  231.         $mailingStatistic->setMobileVersion(CommonUtil::isMobileDevice($request));
  232.         $user null;
  233.         if ($userID) {
  234.             $user $entityManager->find(User::class, $userID);
  235.             if ($user) {
  236.                 $mailingStatistic->setUser($user);
  237.             }
  238.         }
  239.         $mailingStatistic->setIpAddress($request->getClientIp());
  240.         $mailingStatistic->setMailingCampaign($mailingCampaign);
  241.         $mailingStatistic->setEntityID($entityID);
  242.         $mailingStatistic->setEntityType($entityType);
  243.         $entityManager->persist($mailingStatistic);
  244.         $entityManager->flush();
  245.         if ($user) {
  246.             $eventData['campaign_id'] = $mailingCampaignID;
  247.             $utmData['utm_source'] = $request->query->get('utm_source''');
  248.             $utmData['utm_medium'] = $request->query->get('utm_medium''');
  249.             $utmData['utm_campaign'] = $request->query->get('utm_campaign''');
  250.             $utmData['utm_term'] = $request->query->get('utm_term''');
  251.             $utmData['utm_content'] = $request->query->get('utm_content''');
  252.             $amplitude = new Amplitude($user);
  253.             $amplitude->sendEvent('CampaignLetterClicked'$eventData$utmData);
  254.         }
  255.     }
  256.     private function isIncludedToRoute(string $pathInfo): bool
  257.     {
  258.         $matches = \array_filter(
  259.             self::PATTERNS_FOR_NOT_REDIRECT,
  260.             static fn(string $needle): bool => false !== strpos($pathInfo$needle),
  261.         );
  262.         return < \count($matches);
  263.     }
  264. }