Do you want to know who visits your website, where they’re from, and when?
In this post, I’ll show you how to build a small Symfony project that:
- Detects the visitor’s IP address
- Retrieves geolocation data based on the IP
- Stores this data in a database
- Displays the IP, country, and city on the homepage
⚙️ Project Setup
Creating a new Symfony project:
composer create-project symfony/skeleton:"6.4.*" ip-tracker cd ip-tracker
Installing required dependencies:
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
🧱 Creating the Controller
File:
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,
]);
}
}
🌐 Geolocation Service
File:
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();
}
}
🗃 Creating an Entity for Logging
Command:
php bin/console make:entity VisitorLog
Fields:
-
ip
: string
-
country
: string (nullable)
-
city
: string (nullable)
-
createdAt
: datetime_immutable
Migrations:
php bin/console make:migration php bin/console doctrine:migrations:migrate
🖥 Template for Displaying Information to Users
File:
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 %}
📦 Project Dependencies
According to the list in
composer.json
, this project uses:
- Symfony 6.4
- Doctrine ORM
- Twig
- Carbon
- HttpClient
- MakerBundle (dev)
📝 Conclusion
Together we’ve built a full-featured IP logger on Symfony:
✅ Detects IP
✅ Retrieves geolocation
✅ Stores data in the database
✅ Displays it on the page
This functionality can serve as the foundation for a more complete analytics system, access control, or content personalization for your users.