Journal

Symfony 7 : ce qui change concrètement pour vos projets

Journal du lundi 24 août 2026, généré le 24 août à 09:52

Un socle PHP 8.2+ qui change les habitudes

Symfony 7 exige PHP 8.2 minimum. Concrètement, cela signifie que vous pouvez enfin généraliser les readonly properties, les enums en argument de constructeur, et le typage natif partout, y compris sur les propriétés promues. Les anciens services avec des setters mutables perdent de leur intérêt : privilégiez la construction immuable.

final class PriceCalculator
{
    public function __construct(
        private readonly TaxRateProvider $taxRateProvider,
        private readonly RoundingMode $rounding = RoundingMode::HALF_UP,
    ) {}
}

Le composant Scheduler, une vraie alternative à cron

Introduit en 7.1, Scheduler permet de définir des tâches récurrentes directement en PHP, avec la même sémantique que Messenger (messages, handlers, transports). Fini les entrées crontab dispersées : la logique de planification vit dans le code versionné.

#[AsSchedule('default')]
class DefaultSchedule implements ScheduleProviderInterface
{
    public function getSchedule(): Schedule
    {
        return (new Schedule())->add(
            RecurringMessage::every('1 hour', new CleanupExpiredTokens())
        );
    }
}

Chaque exécution passe par le bus Messenger habituel, ce qui donne accès aux retry policies, au monitoring des échecs et aux middlewares déjà en place dans votre application.

Le point d'attention

Scheduler tourne dans un worker dédié (messenger:consume scheduler_default). Sans supervision (Supervisor, systemd), les tâches s'arrêtent silencieusement au redémarrage du serveur : ne l'oubliez pas en production.

Autowiring plus explicite avec les attributs

Les attributs #[Autowire], #[AutowireIterator] et #[AutowireLocator] remplacent progressivement la configuration YAML pour injecter des paramètres, des services taggés ou des collections. Cela rapproche la déclaration du point d'usage :

public function __construct(
    #[Autowire('%kernel.project_dir%/var/exports')]
    private readonly string $exportDir,
    #[AutowireIterator('app.notifier_channel')]
    private readonly iterable $channels,
) {}

ObjectMapper : mapper des DTO sans boilerplate

Apparu en 7.3, ce composant (encore marqué expérimental) transforme une entité en DTO via des attributs plutôt que du code de mapping manuel :

#[Map(target: UserDto::class)]
class User
{
    #[Map(target: 'fullName')]
    public string $name;
}

Utile pour les API où l'on veut découpler le modèle de persistance de la représentation exposée, sans dépendre d'une lib tierce comme AutoMapper.

À retenir pour une montée de version

  • Auditez vos setters mutables : migrez vers des constructeurs readonly.
  • Remplacez les tâches cron internes par Scheduler quand elles dépendent de services applicatifs.
  • Basculez les injections YAML répétitives vers les attributs #[Autowire*] pour améliorer la lisibilité.
  • Testez ObjectMapper sur un sous-ensemble de DTO avant de l'adopter largement, tant qu'il reste expérimental.