Хочете дізнаватися, хто заходить на ваш сайт, звідки і коли? У цьому пості покажу, як створити невеликий проєкт на 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
✅ Отримує геолокацію
✅ Зберігає в базу
✅ Виводить на сторінці
Цей функціонал може стати прикладом основи для повноцінної системи статистики, обмеження доступу або персоналізації контенту для користувачів.