Aller au contenu principal

Migration Symfony · 4.4 → 5.4

Migrer de Symfony 4 à Symfony 5

Symfony 4.4 ne reçoit plus de correctifs de sécurité depuis novembre 2023 ; Symfony 5.4 reste couvert par les correctifs de sécurité jusqu’en février 2029. Une seule version majeure à franchir : on élimine les dépréciations de 4.4, puis on passe en 5.4. PHP passe de 7.1.3 minimum à 7.2.5 minimum. Première rupture à traiter : le composant Debug est déprécié au profit d'ErrorHandler : remplacer Symfony\Component\Debug\Debug par ErrorHandler\Debug.

Où en est le support de Symfony 4.4 et 5.4 ?

Support de Symfony 4.4 et 5.4
CritèreSymfony 4.4Symfony 5.4
Sortienovembre 2019novembre 2021
Fin des correctifs de bugsnovembre 2022novembre 2024
Fin des correctifs de sécuriténovembre 2023février 2029
PHP minimum7.1.37.2.5

Statuts vérifiés le 08/11/2026 sur les pages officielles de version.

Les ruptures à traiter en premier

  1. Bloquant · 4.4Le composant Debug est déprécié au profit d'ErrorHandler : remplacer Symfony\Component\Debug\Debug par ErrorHandler\Debug.source
  2. Bloquant · 4.4Command::execute() qui renvoie null est déprécié : retourner explicitement 0 (ou un code de sortie).source

Le chemin de migration, étape par étape

Chaque étape se termine sur une version sans dépréciation avant la majeure suivante : c’est la seule montée que la promesse de rétrocompatibilité de Symfony couvre. Avant de lancer le chantier, mesurer la dette avec un Bear Scan chiffre la dette qui ralentira chaque étape.

Côté outillage, Rector 2 ne s’appuie plus sur un set par version : withComposerBased(symfony: true) applique les règles de la version de Symfony installée, et withAttributesSets(symfony: true) convertit les annotations en attributs. On relance Rector après chaque montée de composer.json (configuration testée sur un passage vers Symfony 8).

Avant de quitter Symfony 4.4

PHP minimum : 7.1.3

  • BloquantLe composant Debug est déprécié au profit d'ErrorHandler : remplacer Symfony\Component\Debug\Debug par ErrorHandler\Debug.source
  • BloquantCommand::execute() qui renvoie null est déprécié : retourner explicitement 0 (ou un code de sortie).source
  • À traiterGuard : checkCredentials() doit renvoyer un booléen explicite (false pour des identifiants invalides).source
  • À traiterExceptionEvent::getException()/setException() sont dépréciés au profit de getThrowable()/setThrowable().source
  • MineurLe cache de métadonnées du Validator passe à PSR-6 : setMetadataCache() remplacé par setMappingCache().source
  • MineurLock : StoreInterface est remplacée par BlockingStoreInterface et PersistingStoreInterface.source

Pièges rencontrés en migration

  • Dernier palier LTS avant 5.0 : traiter toutes les dépréciations ici, car la 5.0 est la 4.4 sans compatibilité ascendante. Support de sécurité jusqu'en novembre 2023.source
  • TemplateController ne supporte plus le moteur templating : tout rendu passe par Twig.source

Symfony 5 (5.0, 5.1, 5.2, 5.3 et 5.4)

PHP minimum : 7.2.5

  • Bloquant · 5.0SimpleAuthenticatorInterface et ses variantes Form/PreAuthenticator sont supprimés : réécrire en authenticators Guard.source
  • Bloquant · 5.0Controller et ContainerAwareCommand sont supprimés : étendre AbstractController et injecter les services dans les commandes.source
  • Bloquant · 5.0La syntaxe de contrôleur bundle:controller:action n'est plus supportée : référencer les contrôleurs par FQCN::méthode.source
  • Bloquant · 5.2Les services publics form.factory, form.type.file, translator et d'autres sont dépréciés : les injecter plutôt que les récupérer par le conteneur.source
  • Bloquant · 5.3UserInterface::getUsername() est déprécié au profit de getUserIdentifier().source
  • Bloquant · 5.3getPassword() sort de UserInterface : implémenter PasswordAuthenticatedUserInterface.source

Pièges rencontrés en migration

  • Sans compatibilité ascendante : passer de 4.4 à 5.0 avec des dépréciations restantes casse la compilation du conteneur ; viser zéro dépréciation avant.source
  • Version non LTS supportée jusqu'en juillet 2020 seulement : à traverser rapidement.source
  • Les transports Messenger Doctrine/Redis/AMQP doivent être installés via leurs paquets dédiés (symfony/doctrine-messenger, etc.) : à ajouter dans composer.json.source

Ce que Symfony 5.4 vous apporte

  • 5.0 : Le composant String offre une API orientée objet pour manipuler les chaînes (expérimental).source
  • 5.1 : Le composant Uid génère des UUID et des ULID.source
  • 5.2 : Le composant Rate Limiter (framework.rate_limiter) propose les stratégies fixed_window et token_bucket.source
  • 5.3 : Les Config Builder Classes génèrent des classes pour configurer les bundles en PHP avec une interface fluide.source
  • 5.4 : Messenger : handlers déclarés par attributs PHP, traitement par lots et reset des services entre messages.source

Combien coûte cette migration ?

  • Petite application

    100 fichiers PHP, 15 entités, 2 bundles maison

    4 680 € HT

  • Application métier

    400 fichiers PHP, 60 entités, 6 bundles maison

    18 370 € HT

  • Plateforme

    1 200 fichiers PHP, 150 entités, 15 bundles maison

    63 380 € HT

Exemples de la grille Bear Upgrade pour Symfony 4 → 5 (tests à 20 %, sans PHPStan ni CI), pas des devis : le prix ferme est fixé au cadrage.

Pour confier la migration à Bear Upgrade, Rector tourne d’abord en dry-run sur les transformations mécaniques, Claude Code traite les cas que Rector ne couvre pas, puis un développeur senior relit chaque Merge Request. Votre équipe veut reprendre la main ensuite ? Pensez à apprendre à piloter Claude Code sur votre code. Exemple concret : la migration Symfony d’un e-commerce bordelais, et après la migration, la maintenance des versions garde le socle à jour.

Sur une base aussi ancienne, l’audit d’abord : Bear Scan mesure tests, dépendances abandonnées et code mort avant de fixer le prix de la migration.

Questions fréquentes

Pour aller plus loin

Sources

Votre migration Symfony 4 → 5, livrée en Merge Requests

CI au vert garantie 7 jours après le merge. Un appel de cadrage suffit pour fixer le périmètre, le prix et le délai.