16.6 — Migration Symfony 5 → 7
Guide pour un développeur qui connaissait Symfony 5 et retrouve le framework en 7.4. « Qu’est-ce qui a changé ? »
La stratégie : d’LTS en LTS
On ne saute pas directement de 5.x à 7.4. On migre une majeure à la fois, en s’appuyant sur les LTS :
À chaque étape : (1) éliminer toutes les dépréciations sur la version actuelle (le profiler/les tests les listent), (2) monter à la majeure suivante (le code déprécié y est supprimé, mais vous ne l’utilisez plus). Cf. 1.2.
Outil clé : Rector (sets Symfony + PHP) automatise l’essentiel des transformations. Cf. 14.6.
Ce qui a le plus changé depuis Symfony 5
| Domaine | Symfony 5 (ancien) | Symfony 7.4 (actuel) |
|---|---|---|
| Configuration | annotations @Route, @ORM\Column dans des commentaires | attributs #[Route], #[ORM\Column] |
| Dépendance annotations | doctrine/annotations requis | natif (attributs PHP) |
| Sécurité | ancien système + anonymous: true, Guard authenticators | authenticators (Passport), plus d’anonymous |
| Squelette | website-skeleton | skeleton + --webapp / packs |
| ParamConverter | @ParamConverter (SensioFrameworkExtraBundle) | #[MapEntity] (natif) |
| Front | Webpack Encore (node_modules, build) | AssetMapper (sans build) par défaut |
| Doctrine | ORM 2, annotations/YAML | ORM 3, attributs, DBAL 4 |
| API Platform | 2.x, DataProvider/Persister | 3/4, State Provider/Processor, opérations en attributs |
| Requête → arguments | ParamConverter | Value Resolvers (#[MapRequestPayload], #[MapQueryString]) |
| Bundles | Extension + Configuration verbeux | AbstractBundle (concis) |
| Messenger | MessageHandlerInterface | attribut #[AsMessageHandler] |
| Commandes | $defaultName statique | attribut #[AsCommand] |
| PHP minimum | 7.2 (5.4) | 8.2 (toute la 7.x) |
Le plus grand choc visuel
Vos souvenirs de Symfony 5 sont probablement remplis de commentaires :
// Symfony 5
/**
* @Route("/bookings/{id}", name="booking_show")
* @ORM\Column(type="string", length=255)
*/En 7.4, tout est en attributs natifs :
// Symfony 7.4
#[Route('/bookings/{id}', name: 'booking_show')]
#[ORM\Column(length: 255)]C’est le changement à intégrer en priorité : votre œil doit passer de @ (commentaires) à #[...] (langage). Rector fait la conversion automatiquement (AnnotationToAttributeRector).
Checklist de migration (par étape de majeure)
- Être à jour dans la mineure actuelle (ex. dernière 5.4).
composer: lister les dépréciations (profiler, tests avec le pont Symfony).- Éliminer toutes les dépréciations (messages « utilisez Y au lieu de X »).
- Lancer Rector (set de la majeure cible) sur un dépôt propre,
--dry-runpuis relire. - Monter la contrainte
symfony/*d’un cran majeur danscomposer.json,composer update. - Corriger ce qui reste, lancer les tests, vérifier le profiler.
- Committer. Recommencer pour la majeure suivante.
Ce qui n’a PAS changé (rassurant)
- La structure (
src/,config/,templates/,public/) et le pipeline requête→réponse. - Le conteneur de services / autowiring / injection par constructeur.
- Twig, Doctrine (les concepts), le routing (par nom).
- La promesse de rétrocompatibilité : à l’intérieur d’une majeure, rien ne casse.
Vos fondamentaux Symfony 5 sont toujours valides ; c’est surtout la syntaxe de configuration (annotations → attributs) et quelques sous-systèmes (sécurité, front) qui ont évolué.
Suivant : 16.7 — Ressources.