vendor/tchoulom/view-counter-bundle/Counter/AbstractViewCounter.php line 207

Open in your IDE?
  1. <?php
  2. /**
  3.  * This file is part of the TchoulomViewCounterBundle package.
  4.  *
  5.  * @package    TchoulomViewCounterBundle
  6.  * @author     Original Author <tchoulomernest@yahoo.fr>
  7.  *
  8.  * (c) Ernest TCHOULOM
  9.  *
  10.  * For the full copyright and license information, please view the LICENSE
  11.  * file that was distributed with this source code.
  12.  */
  13. namespace Tchoulom\ViewCounterBundle\Counter;
  14. use Symfony\Component\HttpFoundation\Request;
  15. use Symfony\Component\HttpFoundation\RequestStack;
  16. use Tchoulom\ViewCounterBundle\Entity\ViewCounterInterface;
  17. use Tchoulom\ViewCounterBundle\Model\ViewCountable;
  18. use Tchoulom\ViewCounterBundle\Manager\CounterManager;
  19. use Tchoulom\ViewCounterBundle\Model\ViewcounterConfig;
  20. use Tchoulom\ViewCounterBundle\Manager\StatsManager;
  21. use Tchoulom\ViewCounterBundle\Util\Date;
  22. /**
  23.  * Class AbstractViewCounter
  24.  */
  25. abstract class AbstractViewCounter
  26. {
  27.     /**
  28.      * CounterManager
  29.      */
  30.     protected $counterManager;
  31.     /**
  32.      * @var RequestStack
  33.      */
  34.     protected $requestStack;
  35.     /**
  36.      * @var StatsManager
  37.      */
  38.     protected $statsManager;
  39.     /**
  40.      * The View counter configs.
  41.      *
  42.      * @var ViewcounterConfig
  43.      */
  44.     protected $viewcounterConfig;
  45.     /**
  46.      * The viewCounter
  47.      */
  48.     protected $viewCounter null;
  49.     /**
  50.      * The class namespace
  51.      */
  52.     protected $class null;
  53.     /**
  54.      * The property
  55.      */
  56.     protected $property null;
  57.     /**
  58.      * The current Page
  59.      */
  60.     protected $page null;
  61.     const ON_REFRESH 'on_refresh';
  62.     const DAILY_VIEW 'daily_view';
  63.     const UNIQUE_VIEW 'unique_view';
  64.     const HOURLY_VIEW 'hourly_view';
  65.     const WEEKLY_VIEW 'weekly_view';
  66.     const MONTHLY_VIEW 'monthly_view';
  67.     const YEARLY_VIEW 'yearly_view';
  68.     const VIEW_PER_MINUTE 'view_per_minute';
  69.     const VIEW_PER_SECOND 'view_per_second';
  70.     /**
  71.      * AbstractViewCounter constructor.
  72.      *
  73.      * @param CounterManager $counterManager
  74.      * @param RequestStack $requestStack
  75.      * @param ViewcounterConfig $viewcounterConfig
  76.      */
  77.     public function __construct(
  78.         CounterManager    $counterManager,
  79.         RequestStack      $requestStack,
  80.         ViewcounterConfig $viewcounterConfig
  81.     )
  82.     {
  83.         $this->counterManager $counterManager;
  84.         $this->requestStack $requestStack;
  85.         $this->viewcounterConfig $viewcounterConfig;
  86.     }
  87.     /**
  88.      * Determines whether the view is new.
  89.      *
  90.      * @param ViewCounterInterface $viewCounter
  91.      *
  92.      * @return mixed
  93.      */
  94.     abstract public function isNewView(ViewCounterInterface $viewCounter);
  95.     /**
  96.      * Loads the ViewCounter.
  97.      *
  98.      * @param ViewCountable $page The counted object(a tutorial or course...)
  99.      *
  100.      * @return ViewCounterInterface
  101.      */
  102.     protected function loadViewCounter(ViewCountable $page): ViewCounterInterface
  103.     {
  104.         $this->counterManager->loadMetadata($page);
  105.         $this->property $this->counterManager->getProperty();
  106.         $this->class $this->counterManager->getClass();
  107.         $clientIP $this->getClientIp();
  108.         $viewCounter $this->counterManager->findOneBy($criteria = [$this->property => $page'ip' => $clientIP],
  109.             $orderBy = ['viewDate' => 'DESC'], $limit null$offset null);
  110.         if ($viewCounter instanceof ViewCounterInterface) {
  111.             return $viewCounter;
  112.         }
  113.         return $this->createViewCounterObject($page);
  114.     }
  115.     /**
  116.      * Creates the ViewCounter Object from the class namespace.
  117.      *
  118.      * @param ViewCountable $page The given page.
  119.      *
  120.      * @return ViewCounterInterface
  121.      */
  122.     protected function createViewCounterObject(ViewCountable $page): ViewCounterInterface
  123.     {
  124.         $this->counterManager->loadMetadata($page);
  125.         $class $this->counterManager->getClass();
  126.         $viewCounterObject = new $class();
  127.         return $viewCounterObject;
  128.     }
  129.     /**
  130.      * Gets the ViewCounter.
  131.      *
  132.      * @param ViewCountable null $page The counted object(a tutorial or course...)
  133.      *
  134.      * @return ViewCounterInterface
  135.      */
  136.     public function getViewCounter(ViewCountable $page null): ViewCounterInterface
  137.     {
  138.         $viewCounter $this->loadViewCounter($page);
  139.         return $viewCounter;
  140.     }
  141.     /**
  142.      * Gets the page Views.
  143.      *
  144.      * @param ViewCountable $page The counted object(a tutorial or course...)
  145.      *
  146.      * @return int
  147.      */
  148.     public function getViews(ViewCountable $page): int
  149.     {
  150.         $viewCounter $this->getViewCounter($page);
  151.         if (null == $viewCounter || $this->isNewView($viewCounter)) {
  152.             return $page->getViews() + 1;
  153.         }
  154.         return $page->getViews();
  155.     }
  156.     /**
  157.      * Saves the View
  158.      *
  159.      * @param ViewCountable $page The counted object(a tutorial or course...)
  160.      *
  161.      * @return ViewCountable
  162.      *
  163.      * @throws \ReflectionException
  164.      */
  165.     public function saveView(ViewCountable $page): ViewCountable
  166.     {
  167.         $viewcounter $this->getViewCounter($page);
  168.         if ($this->isNewView($viewcounter)) {
  169.             $viewcounter $this->createViewCounterObject($page);
  170.             $views $this->getViews($page);
  171.             $viewcounter->setIp($this->getClientIp());
  172.             $property $this->getProperty();
  173.             $viewcounter->setProperty($property);
  174.             $viewcounter->setPage($page);
  175.             $viewcounter->setViewDate(Date::getNowDate());
  176.             $page->setViews($views);
  177.             $this->counterManager->save($viewcounter);
  178.             $this->counterManager->save($page);
  179.             // Statistics
  180.             if (true === $this->isStatsEnabled()) {
  181.                 $this->handleStatistics($viewcounter);
  182.             }
  183.         }
  184.         return $page;
  185.     }
  186.     /**
  187.      * Handles statistics.
  188.      *
  189.      * @param ViewCounterInterface $viewcounter The viewcounter entity.
  190.      *
  191.      * @throws \ReflectionException
  192.      */
  193.     public function handleStatistics(ViewCounterInterface $viewcounter)
  194.     {
  195.         $this->statsManager->register($viewcounter);
  196.     }
  197.     /**
  198.      * Gets the current Request.
  199.      *
  200.      * @return Request|null
  201.      */
  202.     protected function getRequest(): ?Request
  203.     {
  204.         return $this->requestStack->getCurrentRequest();
  205.     }
  206.     /**
  207.      * Gets the view strategy.
  208.      *
  209.      * @return mixed
  210.      */
  211.     protected function getViewStrategy()
  212.     {
  213.         $viewcounterNodeConfig $this->viewcounterConfig->getViewcounterNodeConfig();
  214.         $viewStrategy $viewcounterNodeConfig->getViewStrategy();
  215.         return $viewStrategy;
  216.     }
  217.     /**
  218.      * Is stats enabled ?
  219.      *
  220.      * @return bool Is stats enabled ?
  221.      */
  222.     protected function isStatsEnabled(): bool
  223.     {
  224.         $statisticsNodeConfig $this->viewcounterConfig->getStatisticsNodeConfig();
  225.         $isStatsEnabled $statisticsNodeConfig->isStatsEnabled();
  226.         return $isStatsEnabled;
  227.     }
  228.     /**
  229.      * Gets the class namespace.
  230.      *
  231.      * @return mixed
  232.      */
  233.     protected function getClass()
  234.     {
  235.         return $this->class;
  236.     }
  237.     /**
  238.      * Gets the property.
  239.      *
  240.      * @return mixed
  241.      */
  242.     protected function getProperty()
  243.     {
  244.         return $this->property;
  245.     }
  246.     /**
  247.      * Sets the current Page   The counted object(a tutorial or course...)
  248.      *
  249.      * @param ViewCountable $page
  250.      *
  251.      * @return self
  252.      */
  253.     protected function setPage(ViewCountable $page): self
  254.     {
  255.         $this->page $page;
  256.         return $this;
  257.     }
  258.     /**
  259.      * Gets the current Page   The counted object(a tutorial or course...)
  260.      *
  261.      * @return ViewCountable|null
  262.      */
  263.     protected function getPage(): ?ViewCountable
  264.     {
  265.         return $this->page;
  266.     }
  267.     /**
  268.      * Gets the client IP.
  269.      *
  270.      * @return null|string
  271.      */
  272.     public function getClientIp(): ?string
  273.     {
  274.         return $this->getRequest()->getClientIp();
  275.     }
  276.     /**
  277.      * Sets the StatsManager.
  278.      *
  279.      * @param StatsManager $statsManager
  280.      *
  281.      * @return self
  282.      */
  283.     public function setStatsManager(StatsManager $statsManager): self
  284.     {
  285.         $this->statsManager $statsManager;
  286.         return $this;
  287.     }
  288. }