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.
 
			