Aller au contenu principal

Migration Symfony · 5.4 → 6.4 → 7.4

Migrer de Symfony 5 à Symfony 7

Symfony 5.4 reste couvert par les correctifs de sécurité jusqu’en février 2029 ; Symfony 7.4 reste couvert par les correctifs de sécurité jusqu’en novembre 2029. Le chemin sûr traverse 2 versions majeures en s’arrêtant sur chaque LTS : 5.4 → 6.4 → 7.4. PHP passe de 7.2.5 minimum à 8.2 minimum. Première rupture à traiter : iS_AUTHENTICATED_ANONYMOUSLY et IS_ANONYMOUS sont dépréciés : utiliser PUBLIC_ACCESS dans access_control.

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

Support de Symfony 5.4 et 7.4
CritèreSymfony 5.4Symfony 7.4
Sortienovembre 2021novembre 2025
Fin des correctifs de bugsnovembre 2024novembre 2028
Fin des correctifs de sécuritéfévrier 2029novembre 2029
PHP minimum7.2.58.2

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

Les ruptures à traiter en premier

  1. Bloquant · 5.4IS_AUTHENTICATED_ANONYMOUSLY et IS_ANONYMOUS sont dépréciés : utiliser PUBLIC_ACCESS dans access_control.source
  2. Bloquant · 5.4isAnonymous() et is_anonymous() sont dépréciés, l'état anonyme disparaît en 6.0 : utiliser isAuthenticated() ou isFullFledged().source
  3. Bloquant · 7.0L'intégration de doctrine/annotations est supprimée : routes, validation et serializer n'acceptent plus que les attributs PHP natifs.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, un audit Bear Scan avant de migrer 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 5.4

PHP minimum : 7.2.5

  • BloquantIS_AUTHENTICATED_ANONYMOUSLY et IS_ANONYMOUS sont dépréciés : utiliser PUBLIC_ACCESS dans access_control.source
  • BloquantisAnonymous() et is_anonymous() sont dépréciés, l'état anonyme disparaît en 6.0 : utiliser isAuthenticated() ou isFullFledged().source
  • À traiterSecurityFactoryInterface est déprécié au profit de AuthenticatorFactoryInterface pour les factories de pare-feu personnalisées.source
  • À traiterAuthenticatorInterface::createAuthenticatedToken() est déprécié au profit de createToken().source
  • À traiterAuthenticationEvents::AUTHENTICATION_FAILURE est déprécié : écouter LoginFailureEvent.source
  • À traiterLes tokens ne doivent plus contenir de credentials : Token::getCredentials() est déprécié.source

Pièges rencontrés en migration

  • AbstractController::get(), has(), getDoctrine() et dispatchMessage() sont dépréciés : passer à l'injection de méthode ou de constructeur avant la 6.0.source
  • Dernier palier LTS avant 6.0 (qui partage les mêmes nouveautés que la 5.4) : support de sécurité jusqu'en février 2029, mais plus de correctifs de bugs depuis novembre 2024.source

Symfony 6 (6.0, 6.1, 6.2, 6.3 et 6.4)

PHP minimum : 8.1

  • Bloquant · 6.0Le composant Guard est supprimé : les authenticators doivent passer au système d'authentification (Passport, createToken() à la place de createAuthenticatedToken()).source
  • Bloquant · 6.0UserInterface perd getPassword() et getSalt() : il faut implémenter PasswordAuthenticatedUserInterface (et la variante Legacy pour un sel utilisateur).source
  • Bloquant · 6.0Les rôles IS_AUTHENTICATED_ANONYMOUSLY et IS_ANONYMOUS disparaissent : les règles access_control doivent utiliser PUBLIC_ACCESS.source
  • Bloquant · 6.0AbstractController n'expose plus get(), has(), getDoctrine() ni dispatchMessage() : l'injection par constructeur ou par méthode devient obligatoire.source
  • Bloquant · 6.2La classe et le service Symfony\Component\Security\Core\Security sont dépréciés : utiliser Symfony\Bundle\SecurityBundle\Security.source
  • Bloquant · 6.4L'intégration de doctrine/annotations est dépréciée : migrer routes, validation et serializer vers les attributs natifs, avant la suppression en 7.0.source

Pièges rencontrés en migration

  • PHP 8.0.2 minimum : la migration depuis 5.4 impose de monter PHP avant tout ; corriger d'abord toutes les dépréciations 5.4, car la 6.0 supprime ce que la 5.4 déprécie.source
  • Request::getMasterRequest() et MASTER_REQUEST sont renommés en getMainRequest() et MAIN_REQUEST : un simple rechercher-remplacer évite des erreurs fatales dans les listeners.source
  • Les propriétés publiques et protégées sont désormais considérées finales : surcharger une propriété d'une classe Symfony casse ; affecter sa valeur dans le constructeur.source

Symfony 7 (7.0, 7.1, 7.2, 7.3 et 7.4)

PHP minimum : 8.2

  • Bloquant · 7.0L'intégration de doctrine/annotations est supprimée : routes, validation et serializer n'acceptent plus que les attributs PHP natifs.source
  • Bloquant · 7.0Les options framework.validation.enable_annotations et serializer.enable_annotations disparaissent, remplacées par enable_attributes.source
  • Bloquant · 7.0Command::$defaultName/$defaultDescription et ContainerAwareInterface/Trait sont supprimés : #[AsCommand] et injection de dépendances obligatoires.source
  • Bloquant · 7.0MessageHandlerInterface et MessageSubscriberInterface sont retirés : tous les handlers Messenger doivent utiliser #[AsMessageHandler].source
  • Bloquant · 7.3UserInterface::eraseCredentials() et TokenInterface::eraseCredentials() sont dépréciés : vider les secrets dans __serialize().source
  • 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

Pièges rencontrés en migration

  • PHP 8.2 devient le minimum : planifier la montée PHP (et Docker/CI) avant le passage en 7.0, qui est la vraie condition de blocage sur les hébergements anciens.source
  • Symfony 7.0 ne lit plus les annotations (@Route, @Assert…) : routes et contraintes doivent être déclarées en attributs PHP (#[Route], #[Assert\NotBlank]) avant la montée.source
  • Les nouveaux types natifs cassent les classes qui surchargent des méthodes Symfony sans return type : appliquer le patcher de types avant la montée.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

Ce que Symfony 7.4 vous apporte

  • 7.0 : 7.0 expose les mêmes fonctionnalités que la 6.4 mais sans aucun code déprécié : plus léger et plus strict.source
  • 7.1 : Nouveau composant TypeInfo qui extrait les types PHP depuis propriétés, méthodes et retours de fonctions via plusieurs sources.source
  • 7.2 : Attribut #[AsMessage] pour configurer le ou les transports directement dans la classe du message Messenger.source
  • 7.3 : Commandes invocables avec attributs d'entrée (#[Argument], #[Option]) pour décrire arguments et options dans la signature de __invoke().source
  • 7.4 : Formulaires multi-étapes (form flows) construits avec les concepts habituels de Symfony Form.source

Combien coûte cette migration ?

  • Petite application

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

    5 790 € HT

  • Application métier

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

    22 810 € HT

  • Plateforme

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

    79 380 € HT

Exemples de la grille Bear Upgrade pour Symfony 5 → 7 (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 à la formation Claude Code sur vos projets. 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 5 → 7, 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.