em = $em; $this->eventDispatcher = $eventDispatcher; } /** * Tracks a new visit to provided short code from provided visitor */ public function track(string $shortCode, Visitor $visitor): void { /** @var ShortUrl $shortUrl */ $shortUrl = $this->em->getRepository(ShortUrl::class)->findOneBy([ 'shortCode' => $shortCode, ]); $visit = new Visit($shortUrl, $visitor); /** @var ORM\EntityManager $em */ $em = $this->em; $em->persist($visit); $em->flush($visit); $this->eventDispatcher->dispatch(new ShortUrlVisited($visit->getId())); } /** * Returns the visits on certain short code * * @return Visit[]|Paginator * @throws InvalidArgumentException */ public function info(string $shortCode, VisitsParams $params): Paginator { /** @var ORM\EntityRepository $repo */ $repo = $this->em->getRepository(ShortUrl::class); if ($repo->count(['shortCode' => $shortCode]) < 1) { throw new InvalidArgumentException(sprintf('Short code "%s" not found', $shortCode)); } /** @var VisitRepository $repo */ $repo = $this->em->getRepository(Visit::class); $paginator = new Paginator(new VisitsPaginatorAdapter($repo, $shortCode, $params)); $paginator->setItemCountPerPage($params->getItemsPerPage()) ->setCurrentPageNumber($params->getPage()); return $paginator; } }