src/EventSubscriber/KernelControllerSubscriber.php line 169

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.     ];
  94.     private array $placeHolderDomains = [];
  95.     private $baseDomain;
  96.     private EntityManagerInterface $entityManager;
  97.     private CityCacheService $cityCacheService;
  98.     private PartnerMailingCampaignClickHandler $partnerMailingCampaignClickHandler;
  99.     private CityProvider $cityProvider;
  100.     public function __construct(
  101.         EntityManagerInterface $entityManager,
  102.         CityCacheService $cityCacheService,
  103.         PartnerMailingCampaignClickHandler $partnerMailingCampaignClickHandler,
  104.         CityProvider $cityProvider,
  105.         string $baseDomain
  106.     ) {
  107.         $this->baseDomain $baseDomain;
  108.         $this->entityManager $entityManager;
  109.         $this->cityCacheService $cityCacheService;
  110.         $this->partnerMailingCampaignClickHandler $partnerMailingCampaignClickHandler;
  111.         $this->cityProvider $cityProvider;
  112.     }
  113.     public static function getSubscribedEvents(): array
  114.     {
  115.         return [
  116.             KernelEvents::REQUEST => ['onKernelRequest'33],
  117.             KernelEvents::RESPONSE => ['onKernelResponse'33]
  118.         ];
  119.     }
  120.     public function onKernelRequest(RequestEvent $event): void
  121.     {
  122.         if (!$event->isMainRequest()) {
  123.             return;
  124.         }
  125.         $request $event->getRequest();
  126.         $pathInfo $request->getPathInfo();
  127.         $hostExploded explode('.'$request->getHost());
  128.         $subDomain $hostExploded[0];
  129.         if ($subDomain === 'delyga') {
  130.             return;
  131.         }
  132.         if (\in_array($subDomain$this->allowedSubdomainstrue) && !$this->isIncludedToRoute($pathInfo)) {
  133.             $event->setResponse(new RedirectResponse(
  134.                 \sprintf(
  135.                     'https://%s%s%s',
  136.                     $request->getSession()->get(City::CITY_DOMAIN_SESSION_KEY'www'),
  137.                     $this->baseDomain,
  138.                     $pathInfo,
  139.                 ),
  140.                 Response::HTTP_TEMPORARY_REDIRECT,
  141.             ));
  142.             return;
  143.         }
  144.         $cityID $this->cityProvider->getDefaultCityId();
  145.         $request->getSession()->set(City::CITY_ID_SESSION_KEY$cityID);
  146.         if (!in_array($subDomain$this->allowedSubdomainstrue)) {
  147.             if ('' !== $subDomain && 'www' !== $subDomain) {
  148.                 $subDomainCityId $this->cityCacheService->getCityIdByDomain($subDomain);
  149.                 if (null === $subDomainCityId) {
  150.                     $event->setResponse(new RedirectResponse($this->baseDomain $pathInfo302));
  151.                 } else {
  152.                     $cityID $subDomainCityId;
  153.                 }
  154.             }
  155.             $request->getSession()->set(City::CITY_ID_SESSION_KEY$cityID);
  156.             $request->getSession()->set(City::CITY_DOMAIN_SESSION_KEY$subDomain);
  157.             if (City::DEFAULT_CITY_ID === $cityID && 'www' !== $subDomain) {
  158.                 $event->setResponse(new RedirectResponse('https://www' $this->baseDomain301));
  159.                 return;
  160.             }
  161.         }
  162.         $this->saveMailingStatistic($request);
  163.         $this->partnerMailingCampaignClickHandler->handle($request);
  164.         $seoRepository $this->entityManager->getRepository(Seo::class);
  165.         $metaInfo $seoRepository->getByAlias($pathInfo$subDomain$this->baseDomain);
  166.         if (isset($this->placeHolderDomains[$subDomain])) {
  167.             $request->attributes->set('_controller'"Slivki\\Controller\\DefaultController::domainPlaceHolderAction");
  168.             $request->attributes->set("entityID"$this->placeHolderDomains[$subDomain]);
  169.             return;
  170.         }
  171.         if ($metaInfo && $metaInfo != SoftCache::EMPTY_VALUE) {
  172.             $exploded explode(':'$metaInfo->getResourceURL());
  173.             $url "Slivki\\Controller\\" $exploded[1] . "Controller::" $exploded[2] . 'Action';
  174.             $request->attributes->set('_controller'$url);
  175.             $request->attributes->set("entityID"$metaInfo->getEntityID());
  176.             $request->attributes->set(SiteController::PARAMETER_META_INFO$metaInfo);
  177.             if (!$metaInfo->isActive() && !in_array($subDomain$this->allowedSubdomains)) {
  178.                 $redirectURL $metaInfo->getRedirectURL();;
  179.                 if ($request->query->count()) {
  180.                     $parameters = [];
  181.                     foreach ($request->query->all() as $key => $value) {
  182.                         $parameters[] = $key '=' $value;
  183.                     }
  184.                     $redirectURL .= '?' implode('&'$parameters);
  185.                 }
  186.                 $event->setResponse(new RedirectResponse($redirectURL301));
  187.             }
  188.         }
  189.     }
  190.     public function onKernelResponse(ResponseEvent $event) {
  191.         $refID $event->getRequest()->query->get('ref');
  192.         if ($refID) {
  193.             $cookie Cookie::create('refID'$refID, new \DateTime('+1 month'));
  194.             $event->getResponse()->headers->setCookie($cookie);
  195.         }
  196.     }
  197.     private function saveMailingStatistic(Request $request) {
  198.         $query $request->query;
  199.         $mailingCampaignID $query->getInt('utm_campaign');
  200.         $userID $query->getInt('utm_b');
  201.         $entityID $query->getInt('utm_c');
  202.         $entityType $query->getInt('utm_d');
  203.         $entityManager $this->entityManager;
  204.         // Рассылка с бонусом для Могилева
  205.         if ($mailingCampaignID == 1041 && $userID) {
  206.             $user $entityManager->find(User::class, $userID);
  207.             if (!$user) {
  208.                 return;
  209.             }
  210.             if ($entityManager->getRepository(User::class)->setMogilevMailingBonus($user)) {
  211.                 $request->getSession()->getFlashBag()->add('showMogilevMailingBonusPopup''1');
  212.             }
  213.             return;
  214.         }
  215.         // Рассылка с бонусом для Гомеля
  216.         if ($mailingCampaignID == 1042 && $userID) {
  217.             $user $entityManager->find(User::class, $userID);
  218.             if (!$user) {
  219.                 return;
  220.             }
  221.             if ($entityManager->getRepository(User::class)->setGomelMailingBonus($user)) {
  222.                 $request->getSession()->getFlashBag()->add('showMogilevMailingBonusPopup''1');
  223.             }
  224.             return;
  225.         }
  226.         if (!$mailingCampaignID || !$entityType || !$entityID) {
  227.             return;
  228.         }
  229.         $mailingCampaign $entityManager->find(MailingCampaign::class, $mailingCampaignID);
  230.         if (!$mailingCampaign) {
  231.             return;
  232.         }
  233.         $mailingStatistic = new MailingStatistic();
  234.         $mailingStatistic->setMobileVersion(CommonUtil::isMobileDevice($request));
  235.         $user null;
  236.         if ($userID) {
  237.             $user $entityManager->find(User::class, $userID);
  238.             if ($user) {
  239.                 $mailingStatistic->setUser($user);
  240.             }
  241.         }
  242.         $mailingStatistic->setIpAddress($request->getClientIp());
  243.         $mailingStatistic->setMailingCampaign($mailingCampaign);
  244.         $mailingStatistic->setEntityID($entityID);
  245.         $mailingStatistic->setEntityType($entityType);
  246.         $entityManager->persist($mailingStatistic);
  247.         $entityManager->flush();
  248.     }
  249.     private function isIncludedToRoute(string $pathInfo): bool
  250.     {
  251.         $matches = \array_filter(
  252.             self::PATTERNS_FOR_NOT_REDIRECT,
  253.             static fn(string $needle): bool => false !== strpos($pathInfo$needle),
  254.         );
  255.         return < \count($matches);
  256.     }
  257. }