*/ class AnalyticListener { protected NodeRepository $nodeRepository; protected ViewRepositoryQuery $viewRepositoryQuery; protected ViewFactory $viewFactory; protected RefererRepositoryQuery $refererRepositoryQuery; protected RefererFactory $refererFactory; protected EntityManager $manager; protected CrawlerDetect $crawlerDetect; protected Request $request; protected Node $node; public function __construct( NodeRepository $nodeRepository, ViewRepositoryQuery $viewRepositoryQuery, ViewFactory $viewFactory, RefererRepositoryQuery $refererRepositoryQuery, RefererFactory $refererFactory, EntityManager $manager ) { $this->nodeRepository = $nodeRepository; $this->viewRepositoryQuery = $viewRepositoryQuery; $this->viewFactory = $viewFactory; $this->refererRepositoryQuery = $refererRepositoryQuery; $this->refererFactory = $refererFactory; $this->manager = $manager; $this->crawlerDetect = new CrawlerDetect(); } public function onKernelRequest(RequestEvent $event) { $request = $event->getRequest(); if (!$request->attributes->has('_node')) { return; } if ($this->crawlerDetect->isCrawler($request->headers->get('user-agent'))) { return; } $node = $this->nodeRepository->findOneBy([ 'id' => $request->attributes->get('_node'), 'enableAnalytics' => true, ]); if (!$node) { return; } $this->node = $node; $this->request = $request; $this->createView(); $this->createReferer(); } protected function createView() { $entity = $this->viewRepositoryQuery->create() ->filterByRequest($this->request) ->andWhere('.date=CURRENT_DATE()') ->findOne() ; if (!$entity) { $entity = $this->viewFactory->create($this->node, $this->request->getPathInfo()); } $entity->addView(); $this->save($entity); } protected function createReferer() { if (!$this->request->headers->has('referer')) { return; } $entity = $this->refererRepositoryQuery->create() ->filterByRequest($this->request) ->andWhere('.date=CURRENT_DATE()') ->findOne() ; if (!$entity) { $entity = $this->refererFactory->create($this->node, $this->request->headers->get('referer')); } $entity->addView(); $this->save($entity); } protected function save(EntityInterface $entity) { if ($entity->getId()) { $this->manager->update($entity); } else { $this->manager->create($entity); } } }