Où en est le support de Symfony 2.8 et 7.4 ?
| Critère | Symfony 2.8 | Symfony 7.4 |
|---|---|---|
| Sortie | novembre 2015 | novembre 2025 |
| Fin des correctifs de bugs | novembre 2018 | novembre 2028 |
| Fin des correctifs de sécurité | novembre 2019 | novembre 2029 |
| PHP minimum | 5.3.9 | 8.2 |
Statuts vérifiés le 08/11/2026 sur les pages officielles de version.
Les ruptures à traiter en premier
- Bloquant · 2.8FormTypeInterface::getName() est déprécié : il faut passer à getBlockPrefix() ou aux noms de classe (FQCN) pour les types de formulaire.source
- Bloquant · 3.0Le composant Locale est supprimé : migrer vers Intl (par exemple Intl::getLanguageBundle()).source
- Bloquant · 4.0Les services sont privés par défaut : Container::get() sur un service privé n'est plus supporté.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 2.8
PHP minimum : 5.3.9
- BloquantFormTypeInterface::getName() est déprécié : il faut passer à getBlockPrefix() ou aux noms de classe (FQCN) pour les types de formulaire.source
- À traiterL'option cascade_validation des formulaires est dépréciée au profit de l'option constraints avec la contrainte Valid.source
- À traiterLes scopes du conteneur (Definition::setScope(), ContainerBuilder::getScopes()) sont dépréciés ; le nouveau drapeau shared les remplace.source
- À traiterAbstractVoter est déprécié : les voters doivent étendre la classe Voter.source
- MineurLe paramètre session.cookie_httponly vaut désormais true par défaut : à vérifier si du JavaScript lit le cookie de session.source
Pièges rencontrés en migration
- La 2.8 sert de palier de nettoyage : tout ce qu'elle déprécie est supprimé en 3.0. Corriger les dépréciations (formulaires, scopes, voters) avant de monter.source
Symfony 3 (3.0, 3.1, 3.2, 3.3 et 3.4)
PHP minimum : 5.5.9
- Bloquant · 3.0Le composant Locale est supprimé : migrer vers Intl (par exemple Intl::getLanguageBundle()).source
- Bloquant · 3.0Form::bind() et isBound() sont supprimées : utiliser submit(), isSubmitted() ou handleRequest().source
- Bloquant · 3.0Le service request est supprimé : injecter request_stack et appeler getCurrentRequest().source
- Bloquant · 3.2Appeler isValid() sur un formulaire non soumis est déprécié : écrire isSubmitted() && isValid().source
- Bloquant · 3.2doctrine/annotations n'est plus une dépendance directe de FrameworkBundle : l'ajouter explicitement dans composer.json si vous utilisez des annotations.source
- Bloquant · 3.3L'autowiring par types implémentés est déprécié (retiré en 4.0) : déclarer des alias ou nommer les services par FQCN.source
Pièges rencontrés en migration
- Aucune couche de compatibilité : passer de 2.8 à 3.0 sans avoir éliminé toutes les dépréciations casse le code immédiatement. Les logs de dépréciation de la 2.8 sont le point de départ.source
- Les routes en YAML ou annotations utilisant pattern, _method ou _scheme doivent toutes être réécrites.source
- Version non LTS maintenue environ 14 mois : ne pas s'y arrêter, c'est un simple pas vers la 3.4 LTS.source
À lire sur le blog : Sécuriser votre app Symfony en 30 minutes : checklist OWASP
Symfony 4 (4.0, 4.1, 4.2, 4.3 et 4.4)
PHP minimum : 7.1.3
- Bloquant · 4.0Les services sont privés par défaut : Container::get() sur un service privé n'est plus supporté.source
- Bloquant · 4.0L'autowiring par type implémenté est supprimé : il faut un alias ou un id de service égal au FQCN.source
Étape intermédiaire, détaillée sur sa propre page : migration Symfony 3 → 4
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
Étape intermédiaire, détaillée sur sa propre page : migration Symfony 4 → 5
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
Étape intermédiaire, détaillée sur sa propre page : migration Symfony 5 → 6
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
12 340 € HT
Application métier
400 fichiers PHP, 60 entités, 6 bundles maison
49 010 € HT
Plateforme
1 200 fichiers PHP, 150 entités, 15 bundles maison
173 680 € HT
Exemples de la grille Bear Upgrade pour Symfony 2 → 7 (tests à 20 %, sans PHPStan ni CI), pas des devis : le prix ferme est fixé au cadrage.
Pour une migration Bear Upgrade livrée en Merge Requests, 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
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 (2.8 → 3.4 → 4.4 → 5.4 → 6.4 → 7.4). Le passage peut être enchaîné dans une même mission.
Symfony 7.4 exige PHP 8.2 au minimum, contre PHP 5.3.9 pour Symfony 2.8. La montée de PHP fait partie du chemin et se prépare avec Rector.
Sur la grille Bear Upgrade, une petite application revient à 12 340 € HT, une application métier à 49 010 € HT et une plateforme à 173 680 € HT (tests à 20 %, sans PHPStan ni CI). Le prix ferme est fixé au cadrage, après lecture du code.
Symfony 2.8 ne reçoit plus de correctifs de sécurité depuis novembre 2019 (fin des correctifs de bugs : novembre 2018).
Pour aller plus loin
Sources
- raw.githubusercontent.com/symfony/symfony/2.8/UPGRADE-2.8.md
- raw.githubusercontent.com/symfony/symfony/3.0/UPGRADE-3.0.md
- raw.githubusercontent.com/symfony/symfony/3.2/UPGRADE-3.2.md
- raw.githubusercontent.com/symfony/symfony/3.3/UPGRADE-3.3.md
- symfony.com/releases/3.1
- raw.githubusercontent.com/symfony/symfony/4.0/UPGRADE-4.0.md
- raw.githubusercontent.com/symfony/symfony/5.0/UPGRADE-5.0.md
- github.com/symfony/symfony/blob/6.0/UPGRADE-6.0.md
- github.com/symfony/symfony/blob/7.0/UPGRADE-7.0.md
- github.com/symfony/symfony/blob/7.3/UPGRADE-7.3.md
- github.com/symfony/symfony/blob/7.4/UPGRADE-7.4.md
- symfony.com/releases.json
- symfony.com/blog/symfony-7-0-type-declarations