Aller au contenu principal

Migration Symfony · 7.4 → 8.1

Migrer de Symfony 7 à Symfony 8

Symfony 7.4 reste couvert par les correctifs de sécurité jusqu’en novembre 2029 ; Symfony 8.1 reste couvert par les correctifs de sécurité jusqu’en janvier 2027. Une seule version majeure à franchir : on élimine les dépréciations de 7.4, puis on passe en 8.1. PHP passe de 8.2 minimum à 8.4 minimum. Première rupture à traiter : le format de configuration XML est déprécié pour le conteneur et la validation : migrer vers YAML, PHP ou attributs avant la 8.0.

Où en est le support de Symfony 7.4 et 8.1 ?

Support de Symfony 7.4 et 8.1
CritèreSymfony 7.4Symfony 8.1
Sortienovembre 2025mai 2026
Fin des correctifs de bugsnovembre 2028janvier 2027
Fin des correctifs de sécuriténovembre 2029janvier 2027
PHP minimum8.28.4

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

Les ruptures à traiter en premier

  1. Bloquant · 7.4Le format de configuration XML est déprécié pour le conteneur et la validation : migrer vers YAML, PHP ou attributs avant la 8.0.source
  2. Bloquant · 7.4Les config builders fluides PHP sont dépréciés : retourner des tableaux depuis les fichiers de config ; $this et la portée interne du loader y lèvent une erreur.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 7.4

PHP minimum : 8.2

  • BloquantLe format de configuration XML est déprécié pour le conteneur et la validation : migrer vers YAML, PHP ou attributs avant la 8.0.source
  • BloquantLes config builders fluides PHP sont dépréciés : retourner des tableaux depuis les fichiers de config ; $this et la portée interne du loader y lèvent une erreur.source
  • BloquantRequest::get() est déprécié : lire directement les propriétés attributes, query ou request.source
  • À traiterLe method override HTTP (_method) pour GET, HEAD, CONNECT et TRACE est déprécié et sera ignoré en 8.0.source
  • À traiterLes listeners de firewall invocables sont dépréciés : étendre AbstractListener ou implémenter FirewallListenerInterface.source
  • MineurApplication::add() de Console est déprécié au profit d'addCommand(), et CurrencyType ne renvoie plus que les devises actives (cours légal).source

Pièges rencontrés en migration

  • 7.4 est la dernière version avant la 8.0 : la montée vers 8.0 n'ajoute aucune fonctionnalité, seulement la suppression des dépréciations ; viser zéro notice sur 7.4.source
  • Les getters/setters des classes d'attributs sont dépréciés au profit de propriétés publiques : à vérifier si des attributs maison les appellent.source
  • Les alias de classes du namespace Annotation sont dépréciés : les derniers @Route/@Assert hérités doivent devenir attributs.source

À lire sur le blog : De Symfony 7.4 LTS à la branche 8.x : éliminer les dépréciations proprement · Symfony 7.4 LTS : ce qu'il faut savoir avant de migrer

Symfony 8 (8.0 et 8.1)

PHP minimum : 8.4

  • Bloquant · 8.0Le format XML est abandonné : ExtensionInterface::getXsdValidationBasePath() et getNamespace() disparaissent, tout XML doit passer en YAML, PHP ou attributs.source
  • Bloquant · 8.0Le format PHP fluide de configuration sémantique est supprimé : instancier le builder avec le tableau de config et le retourner.source
  • Bloquant · 8.0Request::get() est supprimé : lire attributes, query ou request directement ; setFormat() n'accepte plus null.source
  • Bloquant · 8.0UserInterface::eraseCredentials() et TokenInterface::eraseCredentials() sont supprimés : effacer les secrets via __serialize().source
  • Bloquant · 8.1Les attributs de contrôleur (#[IsGranted], #[IsCsrfTokenValid], #[Cache]) sont traités à la priorité -10000 sur kernel.controller_arguments au lieu de 30-10.source
  • À traiter · 8.0L'option hide_user_not_found est supprimée : seul expose_security_errors (enum ExposeSecurityLevel) est accepté.source

Pièges rencontrés en migration

  • PHP 8.4 minimum : le saut PHP 8.2 vers 8.4 (voire 8.3) est le principal bloqueur ; mettre à jour image Docker, extensions et CI avant Symfony.source
  • Le XML n'étant plus pris en charge, chaque bundle tiers doit publier une version compatible 8.0 : vérifier les dépendances avant la montée.source
  • Version non-LTS arrêtée (fin 2026-07 selon symfony.com) : cible de passage vers la 8.1 ou rester sur 7.4 LTS.source

À lire sur le blog : De Symfony 7.4 LTS à la branche 8.x : éliminer les dépréciations proprement · Claude Craft #4 : Symfony 8.1, 126 commandes et 3 agents dédiés

Ce que Symfony 8.1 vous apporte

  • 8.0 : 8.0 offre les mêmes fonctionnalités que la 7.4 sans aucun code déprécié : base de code plus légère et plus stricte.source
  • 8.1 : Applications Symfony sans HTTP : conteneur d'injection complet sans dépendre de HttpKernel, utile pour workers et outils CLI.source

Combien coûte cette migration ?

  • Petite application

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

    4 470 € HT

  • Application métier

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

    17 540 € HT

  • Plateforme

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

    60 390 € HT

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

Pour faire migrer votre application avec 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.

Questions fréquentes

Pour aller plus loin

Sources

Votre migration Symfony 7 → 8, 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.