diff --git a/config/services.yaml b/config/services.yaml index 4fc9a31..df67346 100644 --- a/config/services.yaml +++ b/config/services.yaml @@ -23,7 +23,7 @@ services: tags: - { name: kernel.event_listener, event: kernel.exception } - App\Core\EventListener\NodeViewListener: + App\Core\EventListener\AnalyticListener: tags: - { name: kernel.event_listener, event: kernel.request } diff --git a/core/Entity/Analytic/Referer.php b/core/Entity/Analytic/Referer.php new file mode 100644 index 0000000..7565a84 --- /dev/null +++ b/core/Entity/Analytic/Referer.php @@ -0,0 +1,103 @@ +id; + } + + public function getNode(): ?Node + { + return $this->node; + } + + public function setNode(?Node $node): self + { + $this->node = $node; + + return $this; + } + + public function getUri(): ?string + { + return $this->uri; + } + + public function setUri(string $uri): self + { + $this->uri = $uri; + + return $this; + } + + public function getViews(): ?int + { + return $this->views; + } + + public function setViews(int $views): self + { + $this->views = $views; + + return $this; + } + + public function addView(): self + { + ++$this->views; + + return $this; + } + + public function getDate(): ?\DateTimeInterface + { + return $this->date; + } + + public function setDate(\DateTimeInterface $date): self + { + $this->date = $date; + + return $this; + } +} diff --git a/core/Entity/NodeView.php b/core/Entity/Analytic/View.php similarity index 87% rename from core/Entity/NodeView.php rename to core/Entity/Analytic/View.php index 506dbb5..fd15938 100644 --- a/core/Entity/NodeView.php +++ b/core/Entity/Analytic/View.php @@ -1,16 +1,17 @@ children = new ArrayCollection(); $this->aliasNodes = new ArrayCollection(); - $this->nodeViews = new ArrayCollection(); } public function getId(): ?int @@ -572,34 +566,4 @@ class Node implements EntityInterface return $this; } - - /** - * @return Collection|NodeView[] - */ - public function getNodeViews(): Collection - { - return $this->nodeViews; - } - - public function addNodeView(NodeView $nodeView): self - { - if (!$this->nodeViews->contains($nodeView)) { - $this->nodeViews[] = $nodeView; - $nodeView->setNode($this); - } - - return $this; - } - - public function removeNodeView(NodeView $nodeView): self - { - if ($this->nodeViews->removeElement($nodeView)) { - // set the owning side to null (unless already changed) - if ($nodeView->getNode() === $this) { - $nodeView->setNode(null); - } - } - - return $this; - } } diff --git a/core/EventListener/AnalyticListener.php b/core/EventListener/AnalyticListener.php new file mode 100644 index 0000000..f9399d6 --- /dev/null +++ b/core/EventListener/AnalyticListener.php @@ -0,0 +1,117 @@ + + */ +class AnalyticListener +{ + protected NodeRepository $nodeRepository; + protected ViewRepositoryQuery $viewRepositoryQuery; + protected ViewFactory $viewFactory; + protected RefererRepositoryQuery $refererRepositoryQuery; + protected RefererFactory $refererFactory; + protected EntityManager $manager; + 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; + } + + public function onKernelRequest(RequestEvent $event) + { + $request = $event->getRequest(); + + if (!$request->attributes->has('_node')) { + return; + } + + $node = $this->nodeRepository->findOneBy([ + 'id' => $request->attributes->get('_node'), + 'enableViewCounter' => 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); + } + } +} diff --git a/core/EventListener/NodeViewListener.php b/core/EventListener/NodeViewListener.php deleted file mode 100644 index 52b3880..0000000 --- a/core/EventListener/NodeViewListener.php +++ /dev/null @@ -1,68 +0,0 @@ - - */ -class NodeViewListener -{ - protected NodeRepository $nodeRepository; - protected NodeViewRepositoryQuery $nodeViewRepositoryQuery; - protected NodeViewFactory $nodeViewFactory; - protected EntityManager $manager; - - public function __construct( - NodeRepository $nodeRepository, - NodeViewRepositoryQuery $nodeViewRepositoryQuery, - NodeViewFactory $nodeViewFactory, - EntityManager $manager - ) { - $this->nodeRepository = $nodeRepository; - $this->nodeViewRepositoryQuery = $nodeViewRepositoryQuery; - $this->nodeViewFactory = $nodeViewFactory; - $this->manager = $manager; - } - - public function onKernelRequest(RequestEvent $event) - { - $request = $event->getRequest(); - - if (!$request->attributes->has('_node')) { - return; - } - - $node = $this->nodeRepository->findOneById($request->attributes->get('_node')); - - if (!$node || !$node->getEnableViewCounter()) { - return; - } - - $nodeView = $this->nodeViewRepositoryQuery->create() - ->filterByRequest($request) - ->andWhere('.date=CURRENT_DATE()') - ->findOne() - ; - - if (!$nodeView) { - $nodeView = $this->nodeViewFactory->create($node, $request->getPathInfo()); - } - - $nodeView->addView(); - - if ($nodeView->getId()) { - $this->manager->update($nodeView); - } else { - $this->manager->create($nodeView); - } - } -} diff --git a/core/Factory/Analytic/RefererFactory.php b/core/Factory/Analytic/RefererFactory.php new file mode 100644 index 0000000..8884338 --- /dev/null +++ b/core/Factory/Analytic/RefererFactory.php @@ -0,0 +1,22 @@ +setNode($node) + ->setUri($uri) + ->setDate(new \DateTime()) + ; + + return $entity; + } +} diff --git a/core/Factory/NodeViewFactory.php b/core/Factory/Analytic/ViewFactory.php similarity index 64% rename from core/Factory/NodeViewFactory.php rename to core/Factory/Analytic/ViewFactory.php index ecc3862..840c7ad 100644 --- a/core/Factory/NodeViewFactory.php +++ b/core/Factory/Analytic/ViewFactory.php @@ -1,11 +1,12 @@ andWhere('.node = :node') + ->andWhere('.uri = :uri') + ->setParameters([ + ':node' => $request->attributes->get('_node'), + ':uri' => $request->headers->get('referer'), + ]) + ; + } +} diff --git a/core/Repository/Analytic/ViewRepository.php b/core/Repository/Analytic/ViewRepository.php new file mode 100644 index 0000000..4ddf0a3 --- /dev/null +++ b/core/Repository/Analytic/ViewRepository.php @@ -0,0 +1,21 @@ +id; - } -}