Journal

Symfony 7 : ce qui change vraiment pour le développeur au quotidien

Journal du vendredi 21 août 2026, généré le 23 août à 18:55

Un socle PHP 8.2+ qui simplifie le code

Symfony 7 exige PHP 8.2 minimum et s'appuie massivement sur les types natifs, les enums et les attributs. Concrètement, cela signifie que le framework a pu supprimer une grande partie du code de compatibilité descendante : les annotations Doctrine au format commentaire sont abandonnées au profit des attributs PHP natifs, et de nombreuses classes internes utilisent désormais des readonly properties pour éviter les mutations accidentelles.

Configuration 100 % attributs

Il est désormais possible d'écrire une application complète sans un seul fichier YAML de routage. Les contrôleurs invokables combinés aux attributs #[Route] et #[AsController] deviennent le style par défaut recommandé :

#[AsController]
#[Route('/api/products/{id}', methods: ['GET'])]
final class ShowProductController
{
    public function __invoke(Product $product): JsonResponse
    {
        return $this->json($product);
    }
}

L'autowiring et l'autoconfiguration restent le cœur du conteneur de services, mais Symfony 7 pousse encore plus loin la résolution automatique des types d'arguments (dont les enum directement dans les routes ou les formulaires).

Le composant Scheduler, enfin stable

Introduit expérimentalement dans la branche 6.3, le Scheduler est désormais un composant de premier plan dans Symfony 7. Il remplace avantageusement les tâches cron classiques en gérant les récurrences directement en PHP, avec la fiabilité du composant Messenger derrière :

use Symfony\Component\Scheduler\Attribute\AsPeriodicTask;

#[AsPeriodicTask(frequency: '1 hour')]
final class PurgeExpiredTokens
{
    public function __invoke(): void
    {
        // logique de purge
    }
}

Chaque tâche planifiée devient un message traité par un handler, ce qui permet de bénéficier nativement des retries, du middleware de gestion d'erreurs et de la supervision offerts par Messenger.

Webhook et RemoteEvent : gérer les callbacks externes proprement

Les composants Webhook et RemoteEvent, stabilisés dans la lignée 7.x, standardisent la réception d'événements provenant de services tiers (Stripe, Mailgun, GitHub...). Plutôt que d'écrire un contrôleur ad hoc par intégration, on déclare un consumer qui vérifie automatiquement la signature de la requête entrante et transforme la charge utile en objet RemoteEvent exploitable par Messenger.

Sérialisation et mapping objet plus fins

Le composant Serializer continue de gagner en granularité : groupes de sérialisation combinables avec des attributs contextuels, et un nouveau composant ObjectMapper qui permet de transformer une entité Doctrine en DTO (et inversement) sans passer par des normalizers lourds à configurer, utile notamment pour séparer proprement le modèle de persistance de la représentation exposée en API.

À retenir pour une montée de version

  • Vérifier la compatibilité PHP 8.2+ de toutes les dépendances avant la migration.
  • Remplacer les cron externes par le Scheduler quand la logique de planification vit déjà dans l'application.
  • Basculer les routes YAML/XML restantes vers les attributs pour homogénéiser la base de code.
  • Explorer ObjectMapper avant d'écrire un nouveau DTO mapper maison.