<?php
declare(strict_types=1);
namespace App\Overrides;
use Setono\GoogleAnalyticsMeasurementProtocol\Hit\HitBuilderInterface;
use Setono\GoogleAnalyticsMeasurementProtocol\Hit\HitBuilderStackInterface;
use Setono\GoogleAnalyticsServerSideTrackingBundle\Persister\HitPersisterInterface;
use Setono\MainRequestTrait\MainRequestTrait;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\ResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Entity\Search;
final class PopulateHitBuildersSubscriberOverride implements EventSubscriberInterface
{
use MainRequestTrait;
private HitBuilderStackInterface $hitBuilderStack;
private HitPersisterInterface $hitPersister;
public function __construct(HitBuilderStackInterface $hitBuilderStack, HitPersisterInterface $hitPersister)
{
$this->hitBuilderStack = $hitBuilderStack;
$this->hitPersister = $hitPersister;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::RESPONSE => ['persist', -1000],
];
}
public function persist(ResponseEvent $event): void
{
if (!$this->isMainRequest($event)) {
return;
}
foreach ($this->hitBuilderStack->all(static fn (HitBuilderInterface $hitBuilder) => $hitBuilder->getHitType() !== HitBuilderInterface::HIT_TYPE_PAGEVIEW) as $hitBuilder) {
$this->hitPersister->persistBuilder($hitBuilder);
}
/**
* Here we try to mimic how the client side Google Analytics implementation would track page views
* We track them on 2xx, 4xx, and 5xx HTTP status codes
*/
$statusCode = $event->getResponse()->getStatusCode();
$significantStatusCode = (int) ($statusCode / 100);
// if (!in_array($significantStatusCode, [2, 4, 5], true)) {
if (!in_array($significantStatusCode, [2], true)) {
return;
}
$pathInfo = $event->getRequest()->getPathInfo();
if (strpos($pathInfo, '/admin') !== false) {
return;
}
if (strpos($pathInfo, '/js/routing') !== false) {
return;
}
if (strpos($pathInfo, '/media/cache') !== false) {
return;
}
if (strpos($pathInfo, '/favicon.ico') !== false) {
return;
}
if (strpos($pathInfo, '/i/ws') !== false) {
return;
}
if (strpos($pathInfo, '/estates') !== false) {
return;
}
//filtre acheter et commerce
if( $event->getRequest()->isXmlHttpRequest() && $event->getRequest()->request->has('estate_filter') ){
return ;
}
// $router = $event->get('router');
// $routes = $router->getRouteCollection();
// $matcher = new ExistUrlMatcher($routes, $router->getMatcher()->getContext());
// $is_route_exist = $matcher->isRouteExist($pathInfo);
// dump($is_route_exist);die;
// if(!$is_route_exist){
// return;
// }
$_route = $event->getRequest()->attributes->get('_route');
$available_routes = [
'homepage',
'acheter',
// 'acheter_estate',
'vendre',
'estimation',
'commerces',
// 'commerces_estate',
'agents',
'show_agent',
// 'show_agent_estate',
'devenir_conseiller',
'mentions_legales',
'politique_de_confidentialite',
'contact',
'mon_compte',
'save_user',
'delete_user',
'save_search',
'manage_search',
'toggle_favorite',
'auth',
'app_login',
// 'hit_estate'
];
if(!in_array($_route, $available_routes)){
// dump($_route);
return;
}
foreach ($this->hitBuilderStack->pageviews() as $hitBuilder) {
$this->hitPersister->persistBuilder($hitBuilder);
}
}
}