🌍 Як створити простий трекер IP-адрес з геолокацією на Symfony 6.4

Хочете дізнаватися, хто заходить на ваш сайт, звідки і коли? У цьому пості покажу, як створити невеликий проєкт на Symfony, який:

  • Визначає IP-адресу відвідувача
  • Отримує геолокацію по IP-адресі відвідувача
  • Зберігає ці дані в базу
  • Виводить IP-адресу, країну та місто на головній сторінці

⚙️ Підготовка проєкту

Створення нового проєкту Symfony

composer create-project symfony/skeleton:"6.4.*" ip-tracker
cd ip-tracker

Встановлення необхідних залежностей

composer require symfony/twig-bundle
composer require symfony/http-client
composer require symfony/orm-pack doctrine/doctrine-bundle
composer require nesbot/carbon
composer require symfony/maker-bundle --dev

🧱 Створення контролера

Файл:

src/Controller/ClientIpController.php

<?php

namespace App\Controller;

use App\Entity\VisitorLog;
use App\Service\IpGeolocationService;
use Carbon\Carbon;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

class ClientIpController extends AbstractController
{
    #[Route('/', name: 'app_home')]
    public function index(Request $request, IpGeolocationService $ipService, EntityManagerInterface $em): Response
    {
        $ip = $request->getClientIp();
        $geo = $ipService->getGeolocation($ip);

        $log = new VisitorLog();
        $log->setIp($ip);
        $log->setCountry($geo['country'] ?? null);
        $log->setCity($geo['city'] ?? null);
        $log->setCreatedAt(Carbon::now());

        $em->persist($log);
        $em->flush();

        return $this->render('client_ip/index.html.twig', [
            'ip' => $ip,
            'geo' => $geo,
        ]);
    }
}

🌐 Сервіс геолокації

Файл:

src/Service/IpGeolocationService.php

<?php

namespace App\Service;

use Symfony\Contracts\HttpClient\HttpClientInterface;

class IpGeolocationService
{
    public function __construct(private HttpClientInterface $client) {}

    public function getGeolocation(string $ip): array
    {
        $response = $this->client->request('GET', "https://ipapi.co/{$ip}/json/");
        return $response->toArray();
    }
}

🗃 Створення сутності для зберігання логів

php bin/console make:entity VisitorLog

Поля:

  • ip: string
  • country: string (nullable)
  • city: string (nullable)
  • createdAt: datetime_immutable

Міграція:

php bin/console make:migration
php bin/console doctrine:migrations:migrate

🖥 Шаблон для відображення інформації користувачу

Файл:

templates/client_ip/index.html.twig

{% extends 'base.html.twig' %}

{% block title %}Your IP Address is: {{ ip_address }}{% endblock %}

{% block body %}
<div class="ip-address-wrapper"><h1>Your IP Address is: {{ ip_address }}</h1></div>
{% if geo %}
<ul class="ip-info">
<li>Country: {{ geo.country }}</li>
<li>City: {{ geo.city }}</li>
</ul>
{% endif %}
{% endblock %}

📦 Залежності проєкту

З переліку білбіотек в

composer.json

видно, що проєкт використовує:

  • Symfony 6.4
  • Doctrine ORM
  • Twig
  • Carbon
  • HttpClient
  • MakerBundle (dev)

📝 Висновок

Ми разом з вами створили повноцінний IP-логер на Symfony:

✅ Визначає IP
✅ Отримує геолокацію
✅ Зберігає в базу
✅ Виводить на сторінці

Цей функціонал може стати прикладом основи для повноцінної системи статистики, обмеження доступу або персоналізації контенту для користувачів.