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