src/EventSubscriber/KernelControllerSubscriber.php line 125

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