src/EventSubscriber/WebmasterReferenceRequestSubscriber.php line 46

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Service\Client\Webmaster\WebmasterTrafficService;
  4. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  5. use Symfony\Component\HttpFoundation\RedirectResponse;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. class WebmasterReferenceRequestSubscriber implements EventSubscriberInterface
  10. {
  11.     const SESSION_KEY 'webmaster_reference';
  12.     /**
  13.      * @var WebmasterTrafficService
  14.      */
  15.     protected WebmasterTrafficService $trafficService;
  16.     /**
  17.      * @param WebmasterTrafficService $trafficService+
  18.      */
  19.     public function __construct(WebmasterTrafficService $trafficService)
  20.     {
  21.         $this->trafficService $trafficService;
  22.     }
  23.     public static function getSubscribedEvents(): array
  24.     {
  25.         return [
  26.             KernelEvents::REQUEST => [
  27.                 ['onKernelRequest'1],
  28.             ],
  29.         ];
  30.     }
  31.     /**
  32.      * @param RequestEvent $event
  33.      * @return void
  34.      * @throws \Symfony\Contracts\HttpClient\Exception\ClientExceptionInterface
  35.      * @throws \Symfony\Contracts\HttpClient\Exception\RedirectionExceptionInterface
  36.      * @throws \Symfony\Contracts\HttpClient\Exception\ServerExceptionInterface
  37.      * @throws \Symfony\Contracts\HttpClient\Exception\TransportExceptionInterface
  38.      */
  39.     public function onKernelRequest(RequestEvent $event)
  40.     {
  41.         $request $event->getRequest();
  42.         if(!$event->isMainRequest() || !$request->isMethod('GET')) {
  43.             return;
  44.         }
  45.         $param $request->query->get('wmid'$request->query->get('c'''));
  46.         $campaignId null;
  47.         $webmasterId null;
  48.         if (preg_match('/6[0-9]{6}/'$param)) {
  49.             $webmasterId $param;
  50.         } else {
  51.             $dec base64_decode($param);
  52.             if (preg_match('/^([0-9]+)\|(6[0-9]{6})$/'$dec$matches)) {
  53.                 $campaignId $matches[1];
  54.                 $webmasterId $matches[2];
  55.             } elseif (preg_match('/^(6[0-9]{6})\|([0-9]+)$/'$dec$matches)) {
  56.                 $webmasterId $matches[1];
  57.                 $campaignId $matches[2];
  58.             }
  59.         }
  60.         if($webmasterId) {
  61.             if ($refererUrl $request->server->get('HTTP_REFERER')) {
  62.                 $referer parse_url($refererUrl);
  63.                 $refererHost $referer['host'] ?? null;
  64.             }
  65.             $referenceData = [
  66.                 'webmaster_id' => $webmasterId,
  67.                 'campaign_id' => $campaignId,
  68.                 'tracking_id' => (string) $request->query->get('trackingId')
  69.             ];
  70.             $request->getSession()->set(self::SESSION_KEY$referenceData);
  71.             $this->trafficService->createWebmasterTraffic((int)$webmasterId, [
  72.                 // required in api
  73.                 'http_request_uri' => $request->getRequestUri(),
  74.                 'client_ip' => $request->server->get('HTTP_X_FORWARDED_FOR'$request->getClientIp()),
  75.                 // optional in api
  76.                 'referer_host' => $refererHost ?? null,
  77.                 'referer_url' => $refererUrl,
  78.                 'campaign_id' => $campaignId
  79.             ]);
  80.             $event->setResponse($this->redirectToNonReferenceUrl($request));
  81.         }
  82.     }
  83.     /**
  84.      * @param Request $request
  85.      * @return RedirectResponse
  86.      */
  87.     protected function redirectToNonReferenceUrl(Request $request): RedirectResponse
  88.     {
  89.         $parameters = array();
  90.         foreach ($request->query->all() as $key => $val) {
  91.             if ($key != 'wmid' && $key != 'c') {
  92.                 $parameters[$key] = $val;
  93.             }
  94.         }
  95.         $url $request->getPathInfo();
  96.         if ($queryString http_build_query($parameters)) {
  97.             $url .= '?' $queryString;
  98.         }
  99.         $baseUrl $request->getBaseUrl();
  100.         if ($baseUrl && $baseUrl != '/') {
  101.             $url $baseUrl $url;
  102.         }
  103.         return new RedirectResponse($url);
  104.     }
  105. }