Où en est le support de Symfony 4.4 et 6.4 ?
| Critère | Symfony 4.4 | Symfony 6.4 |
|---|---|---|
| Sortie | novembre 2019 | novembre 2023 |
| Fin des correctifs de bugs | novembre 2022 | novembre 2026 |
| Fin des correctifs de sécurité | novembre 2023 | novembre 2027 |
| PHP minimum | 7.1.3 | 8.1 |
Statuts vérifiés le 08/11/2026 sur les pages officielles de version.
Les ruptures à traiter en premier
- Bloquant · 4.4Le composant Debug est déprécié au profit d'ErrorHandler : remplacer Symfony\Component\Debug\Debug par ErrorHandler\Debug.source
- Bloquant · 4.4Command::execute() qui renvoie null est déprécié : retourner explicitement 0 (ou un code de sortie).source
- Bloquant · 6.0Le composant Guard est supprimé : les authenticators doivent passer au système d'authentification (Passport, createToken() à la place de createAuthenticatedToken()).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, auditer la dette technique avec 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
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
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
Ce que Symfony 6.4 vous apporte
- 6.0 : Symfony 6.0 partage ses nouveautés avec la 5.4 : autocomplétion Console des options et valeurs, via les shells compatibles.source
- 6.1 : Nouveau composant HtmlSanitizer pour transformer du HTML saisi par les utilisateurs en HTML sûr, en filtrant balises et attributs.source
- 6.2 : Nouveau composant Clock pour rendre testable le code dépendant du temps.source
- 6.3 : Attributs MapRequestPayload et MapQueryString pour mapper le corps ou la query string vers des DTO typés, avec validation automatique.source
- 6.4 : Profiler de commandes (option --profile) pour analyser l'exécution des commandes console, et profiler Workflow avec vue graphique.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 4 → 6 (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 à former votre équipe à Claude 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
Pas d’un seul saut. Symfony ne garantit la compatibilité qu’entre une LTS sans dépréciation et la majeure suivante : on corrige les dépréciations, on monte d’une majeure, et on recommence à chaque étape (4.4 → 5.4 → 6.4). Le passage peut être enchaîné dans une même mission.
Symfony 6.4 exige PHP 8.1 au minimum, contre PHP 7.1.3 pour Symfony 4.4. La montée de PHP fait partie du chemin et se prépare avec Rector.
Sur la grille Bear Upgrade, une petite application revient à 5 790 € HT, une application métier à 22 810 € HT et une plateforme à 79 380 € HT (tests à 20 %, sans PHPStan ni CI). Le prix ferme est fixé au cadrage, après lecture du code.
Symfony 4.4 ne reçoit plus de correctifs de sécurité depuis novembre 2023 (fin des correctifs de bugs : novembre 2022).
Pour aller plus loin
Sources
- raw.githubusercontent.com/symfony/symfony/4.4/UPGRADE-4.4.md
- symfony.com/releases/4.4
- raw.githubusercontent.com/symfony/symfony/5.0/UPGRADE-5.0.md
- raw.githubusercontent.com/symfony/symfony/5.2/UPGRADE-5.2.md
- raw.githubusercontent.com/symfony/symfony/5.3/UPGRADE-5.3.md
- symfony.com/releases/5.0
- raw.githubusercontent.com/symfony/symfony/5.1/UPGRADE-5.1.md
- github.com/symfony/symfony/blob/6.0/UPGRADE-6.0.md
- github.com/symfony/symfony/blob/6.2/UPGRADE-6.2.md
- github.com/symfony/symfony/blob/6.4/UPGRADE-6.4.md
- symfony.com/releases.json
- github.com/symfony/symfony/blob/6.1/UPGRADE-6.1.md