Todo App Symfony

Apprendre Symfony et le prouver avec une application réellement en ligne : architecture MVC, conteneur Docker, déploiement sur Render et une démo publique où chaque visiteur a sa propre liste.

Mars 2026 ⏱ Durée : 1 semaine Projet individuel IUT de Troyes
Interface de la Todo App Symfony : champ d'ajout de tâche et liste de tâches à cocher, chacune avec un bouton Supprimer

Le besoin

Symfony est l'un des frameworks PHP les plus demandés en entreprise, et je voulais le découvrir sur un projet concret. Le CRUD d'une liste de tâches n'était qu'un support : l'objectif était d'assimiler l'architecture MVC et de relier l'application à une base de données relationnelle avec Doctrine.

Surtout, je voulais aller jusqu'à la mise en ligne. Une application qui ne tourne que sur mon ordinateur ne prouve pas grand-chose ; une démo publique, n'importe qui peut l'essayer.

La solution

Une application de gestion de tâches développée de A à Z, seul, en une semaine :

Mes choix techniques

Docker pour déployer

Render construit et lance l'application à partir d'une image Docker. J'ai écrit mon propre Dockerfile (PHP 8.2 + Apache, extensions nécessaires, Composer) : l'environnement de production est décrit dans un fichier et peut être reconstruit à l'identique.

un hébergement configuré à la main, impossible à reproduire.

MySQL en local, PostgreSQL en production (première version)

PostgreSQL est la base proposée par l'hébergeur. Doctrine m'a permis de garder l'essentiel du code, mais j'ai dû adapter la syntaxe SQL de la table des tâches.

rester sur MySQL en production.

Une démo publique stockée en session

Avec une base partagée, n'importe quel visiteur de la démo pouvait modifier ou supprimer les tâches des autres. J'ai basculé le stockage des tâches en session : chaque visiteur a sa propre liste, isolée. Le compromis, assumé : les tâches ne sont plus enregistrées en base et disparaissent à la fin de la session.

une base unique partagée par tous les visiteurs.

La difficulté principale

Problème

Fonctionnelle en local, l'application refusait de tourner une fois déployée sur Render : erreurs 500, puis 404 sur toutes les routes.

Résolution

Un problème à la fois, un commit par correctif (l'historique Git en garde la trace) : extensions PHP zip et intl manquantes, WORKDIR et commande de lancement absents du Dockerfile, syntaxe SQL à adapter à PostgreSQL, puis un .htaccess pour qu'Apache envoie les routes vers Symfony.

Des mois plus tard, une autre panne : la démo plantait à chaque redémarrage avec un « exit status 7 ». La base PostgreSQL gratuite de Render avait expiré, et le Dockerfile lançait les migrations avant Apache : sans base, le conteneur s'arrêtait. Comme la démo stocke les tâches en session, j'ai retiré les migrations du démarrage plutôt que de recréer une base devenue inutile.

Ce que je referais autrement

Ce que j'ai appris

Architecture MVC
J'ai compris comment séparer proprement la logique métier, l'accès aux données et l'affichage visuel, rendant le code beaucoup plus maintenable et professionnel.
Maîtrise de l'ORM Doctrine
Fini les requêtes SQL manuelles ! J'ai appris à manipuler la base de données de manière orientée objet, à gérer les entités et à exécuter des migrations complexes.
Conteneurisation (Docker)
Une compétence rare en junior : j'ai configuré un environnement isolé avec Docker, réglant les problèmes de compatibilité entre le serveur web Apache et PHP.
Déploiement Cloud (CI/CD)
Le plus gros défi technique. J'ai surmonté les erreurs de serveur (les fameuses 500 et 404), adapté le code pour PostgreSQL et connecté mon dépôt GitHub pour un déploiement continu.

Stack technique

Technologies et outils utilisés :

PHP 8 Symfony Doctrine ORM Twig PostgreSQL Docker Render (Cloud)

Captures d'écran