src/Controller/VisitController.php line 62

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  4. use Symfony\Component\HttpFoundation\Response;
  5. use Symfony\Component\Routing\Annotation\Route;
  6. use Doctrine\Persistence\ManagerRegistry;
  7. use App\Entity\Visit;
  8. use App\Entity\User;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use DeviceDetector\ClientHints;
  11. use DeviceDetector\DeviceDetector;
  12. use DeviceDetector\Parser\Device\AbstractDeviceParser;
  13. class VisitController extends AbstractController
  14. {
  15.     private function determineIp(Request $request): string
  16.     {
  17.         $a $request->server->get('HTTP_CLIENT_IP');
  18.         $b $request->server->get('HTTP_X_FORWARDED_FOR');
  19.         $c $request->server->get('REMOTE_ADDR');
  20.         if ($a) {
  21.             return $a;
  22.         }
  23.         elseif ($b) {
  24.             return $b;
  25.         }
  26.         else {
  27.             return $c;
  28.         }
  29.     }
  30.     /**
  31.      * @Route("/{slug}/{redirectPath}", name="app_visit", requirements={"slug"="[a-z0-9]+","redirectPath"=".+"})
  32.      */
  33.     public function index(Request $requestManagerRegistry $doctrinestring $slugstring $redirectPath): Response
  34.     {
  35.         // Determine client IP
  36.         $ip $this->determineIp($request);
  37.         // Determine Device
  38.         $dd = new DeviceDetector($request->headers->get('User-Agent'), ClientHints::factory($_SERVER));
  39.         $dd->parse();
  40.         // Build Visit-data
  41.         $visitData = array(
  42.             'client' => $dd->getClient(),
  43.             'os' => $dd->getOs(),
  44.             'device' => $dd->getDeviceName(),
  45.             'brand' => $dd->getBrandName(),
  46.             'model' => $dd->getModel(),
  47.             'ip' => $ip,
  48.             'querystring' => $request->server->get('QUERY_STRING')
  49.         );
  50.         // Determine Owner
  51.         $owner $doctrine->getRepository(User::class)->findOneBy(['slug' => $slug]);
  52.         if (!$owner) {
  53.             throw $this->createNotFoundException('Invalid Slug');
  54.         }
  55.         // Determine Redirect-to
  56.         $redirectTo $this->getParameter('redirectBase') . '/' $redirectPath;
  57.         // Persist this navigation
  58.         if (!$owner->isIsBanned()) {
  59.             $visit = new Visit();
  60.             $visit->setVisitData($visitData);
  61.             $visit->setIpAddress($visitData['ip']); // Separo IP para sacar mejor country
  62.             $visit->setRedirectTo($redirectTo);
  63.             $visit->setSource($request->query->get('source'));
  64.             $visit->setMedium($request->query->get('medium'));
  65.             $visit->setReferer($request->headers->get('Referer'));
  66.             $visit->setUser($owner);
  67.             $doctrine->getRepository(Visit::class)->storeNavigation($visit);
  68.         }
  69.         // Redirect
  70.         if ($owner->isIsBanned()) {
  71.             return $this->redirect($redirectTo);
  72.         }
  73.         else {
  74.             return $this->redirect($redirectTo '?ambref=' $visit->getId());
  75.         }
  76.     }
  77. }