<?php
namespace App\EventListener;
use App\Service\UtmManager;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\HttpKernel\Event\KernelEvent;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class UtmListener implements EventSubscriberInterface
{
private $utmManager;
public function __construct(UtmManager $utmManager)
{
$this->utmManager = $utmManager;
}
public function onKernelController(ControllerEvent $event)
{
$request = $event->getRequest();
if (!$event->isMasterRequest()){
return;
}
$this->utmManager->loadUtm($request);
if ($this->mustUpdateUtm($event, $request)) {
$this->utmManager->updateUtm($request);
}
}
private function mustUpdateUtm(KernelEvent $event, $request){
if (!$event->isMasterRequest() ||
$request->query->count()==0 ||
$event->getRequest()->isXmlHttpRequest() ||
$request->getPathInfo() == '/js/routing' ||
strpos($request->getPathInfo(), '/admin')===0 ||
strpos($request->getPathInfo(), '_profiler')===0
) {
return false;
}
return true;
}
public function onKernelResponse(ResponseEvent $event)
{
$request = $event->getRequest();
$response = $event->getResponse();
if ($this->mustUpdateUtm($event, $request)) {
$this->utmManager->storeUtm($request, $response);
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::RESPONSE => 'onKernelResponse',
KernelEvents::CONTROLLER => 'onKernelController',
];
}
}