Symfony est le framework sur lequel j’ai le plus construit – et le plus déconstruit.
De Symfony 2 chez Gestour en 2011 à Symfony 6 chez IAD en 2024, j’ai vu le framework
évoluer, son écosystème mûrir, et les erreurs qui se répètent d’un projet à l’autre.
Cette page détaille où, quand et comment j’ai utilisé Symfony en conditions réelles.
Votre projet Symfony a besoin d’un spécialiste quand…
Vous démarrez un backend critique
Choix d’architecture, design d’API, conventions d’équipe – mieux vaut poser les
bonnes fondations dès le début plutôt que de les corriger à mi-chemin.
Votre legacy Symfony freine les livraisons
Symfony 2 ou 3 toujours en production, couplage fort, tests absents. Il existe une voie entre
« on touche à rien » et « on réécrit tout »
– c’est mon terrain de jeu.
Une montée de version est inévitable
Migration de Symfony 3/4/5 vers une version récente, avec une couverture de tests
comme prérequis et un plan de migration progressif livrable par étapes.
Les performances se dégradent
Profiling Symfony, optimisation Doctrine, stratégies de cache, révision des requêtes
N+1 – identifier le vrai goulot avant d’investir dans du hardware.
Vous voulez un regard extérieur honnête
Audit de code, revue d’architecture, feuille de route priorisée – sans vendre une
réécriture complète si ce n’est pas nécessaire.
Votre équipe monte en compétence
Introduire DDD, l’architecture hexagonale ou le TDD dans un projet existant, sans perturber
les livraisons. Sessions de pair-programming et revues de code ciblées.
Missions Symfony – 13 ans en contexte réel
IAD Immobilier
2022–2024 · 2 ans
Refonte CRM et moteur de rapprochement immobilier
Au cœur de l’expansion internationale d’IAD (ouverture UK et US), intégration de
deux squads successives pour travailler sur les briques candidature et CRM. Développement du
« projet d’achat » – point d’entrée unique pour gérer
les critères acquéreurs – et d’un moteur de rapprochement automatique biens/critères.
Architecture hexagonale stricte avec approche DDD dès la conception, sur un monolithe modulaire
en cours de découpage.
Modernisation d’un outil de multidiffusion automobile
Suite au rachat de L’Argus, la feature team Import récupère une application legacy de
diffusion d’annonces automobiles. Mission : la mettre en production dans l’écosystème
Adevinta et l’ouvrir à Leboncoin.fr. Réduction de l’image Docker de 1 Go à
quelques centaines de Mo, mise en place de tests fonctionnels sur les flux import/export, refactoring
en architecture hexagonale, et développement d’une API d’automatisation des branchements clients.
Dockerisation des environnements, mise en place d’intégration et déploiement continu sur
des applications Symfony existantes. Ateliers techniques avec les équipes (Xdebug, Gitflow, WSL,
Docker). Migration de suzuki.fr vers Platform.sh.
SymfonyGitHub ActionsDockerPlatform.shAnsible
Diverses startups
2020–2021 · 6 mois
PHP/Symfony serverless sur AWS Lambda
Migration d’une application de calcul de dallage béton (PHP/Symfony monolithique) vers une
architecture serverless sur AWS Lambda. Les calculs lourds sont exécutés en parallèle
par un moteur distribué, avec des gains de performance significatifs.
Symfony · LambdaPHP 7.2AWS API Gateway · CloudFrontTerraformServerless
DgBirds · Air France
2018–2019 · 1,5 an
Transformation API-centric d’un SaaS iPad pour pilotes
SaaS intrapreuneurial au sein d’Air France, outil de gestion de missions pour pilotes et
personnel au sol. Extraction de la logique métier des contrôleurs vers des services applicatifs
pour créer une API indépendante de Symfony et de Doctrine. Migration MySQL 5 →
PostgreSQL 11 avec réécriture de requêtes en CTE récursifs et vues matérialisées.
Définition d’une stratégie tests et setup de l’intégration continue.
Startup de collecte de dons associatifs. Maintenance et évolution de l’API centrale,
développement de microservices asynchrones (ZeroMQ), TDD avec tests d’acceptation.
Infrastructure Docker complète, pipelines CI Jenkins/CircleCI. Long contexte full-remote.
Premier projet Symfony : logiciel de gestion d’agences de voyage
Gestour est l’outil de gestion d’agences de voyage le plus utilisé en France. Sélection
et adoption de Symfony 2 pour les nouveaux développements web – Gestour 360, version web
destinée à remplacer le client lourd C++. Développement d’un CRM pour CroisiEurope
et d’un outil d’analyse statistique métier. Contexte Scrum dans un éditeur SaaS structuré.
Ces outils qui ont résolu un problème… et en ont créé un autre
API Platform – quand le framework dans le framework prend le dessus
API Platform a été une vraie révolution à son époque. Exposer une API REST
documentée en quelques annotations, avec pagination, filtres et validation intégrés –
c’était impressionnant. Beaucoup de projets Symfony ont adopté l’outil sans hésiter.
Sauf qu’API Platform n’est pas un simple bundle. C’est un framework dans le framework,
avec son propre vocabulaire, ses propres abstractions, ses State Providers et Processors qui finissent par
piloter l’organisation du code. Dans une architecture hexagonale, ça crée une tension réelle :
les ressources API commencent à influencer le modèle de domaine, alors que c’est censé être
l’inverse. Et quand un besoin sort des sentiers battus – permissions complexes, réponses non
standard, logique métier riche – on passe plus de temps à contourner l’outil qu’à
coder le domaine.
En 2026, un LLM génère une spec OpenAPI propre et maintenue à jour à partir de controllers
Symfony classiques. L’argument « documentation automatique » a perdu beaucoup de son poids.
Je détaille mon approche de conception d’APIs REST orientées use cases sur une page dédiée.
Sonata Admin – le CRUD qui ne reste jamais simple
Sonata suit la même logique, avec une ironie supplémentaire. Il était là pour éviter
d’écrire du CRUD. Sauf qu’un CRUD d’administration ne reste jamais simple longtemps –
un champ s’ajoute, une règle métier arrive, une interface spécifique est demandée. Et
là commence la vraie douleur : faire rentrer un besoin qui a évolué dans les contraintes d’un
outil qui n’a pas prévu ce cas.
Sans parler des migrations. Sonata est l’une des raisons les plus fréquentes pour lesquelles des
projets restent bloqués sur Symfony 3 ou 4 – sa cascade de dépendances rend toute montée
de version particulièrement pénible. Pour un outil utilisé à 80% comme un simple
générateur de formulaires.
FOSUserBundle, FOSRestBundle, JMSSerializer – l’inertie des dépendances
La liste est longue d’outils qui répondaient à un vrai manque à une époque où
Symfony ne couvrait pas ces besoins nativement. La gestion des utilisateurs, l’exposition REST, la
sérialisation avancée – autant de problèmes que Symfony a depuis absorbés dans son cœur.
Les projets, eux, gardent souvent la dépendance par inertie. Pas par mauvais choix – simplement parce
qu’un projet qui tourne n’a pas toujours le temps ni le budget pour se désendetter au fil des releases.
Ce que ça dit du cycle de vie d’un projet Symfony
Ce n’est pas une question de mauvais choix initiaux. C’est simplement ce qui arrive quand un framework
mature absorbe progressivement son écosystème. Les outils tiers qui comblaient les manques d’hier
deviennent les dettes techniques d’aujourd’hui. Identifier lesquels freinent vraiment
l’évolution du projet – et dans quel ordre s’en défaire – c’est souvent
là que se joue la différence entre un projet qui avance et un projet qui subit.
Je décris mes stratégies de refactoring et modernisation legacy en détail.