src/EventSubscriber/KernelControllerSubscriber.php line 171

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