PHP 8.2 minimum : moins de code, plus de garanties
Symfony 7 impose PHP 8.2 et abandonne tout le code de compatibilité avec les anciennes versions. Concrètement, cela signifie que le framework lui-même utilise désormais massivement les enums, les propriétés readonly et les unions de types dans son cœur. Pour vous, c'est l'occasion de nettoyer vos value objects et vos DTO en toute confiance, sans craindre de régression sur PHP 7 ou 8.0.
Enums dans les attributs et le routing
Les enums backés sont maintenant pleinement supportés comme valeurs par défaut dans les attributs #[Route], les paramètres de service et les formulaires EnumType, ce qui évite les constantes de classe éparpillées.
AssetMapper : la fin de webpack pour beaucoup de projets
AssetMapper, stabilisé en 7.0, exploite les import maps natives du navigateur pour servir du JavaScript et du CSS sans étape de build ni Node.js. Il suffit d'importer un paquet, qui est téléchargé et versionné automatiquement :
php bin/console importmap:require stimulus chart.js
// assets/app.js
import { Application } from '@hotwired/stimulus';
import Chart from 'chart.js/auto';
Pour des applications avec beaucoup d'interactivité côté client, un bundler dédié reste préférable, mais pour la majorité des back-offices Symfony, AssetMapper suffit et supprime une dépendance opérationnelle entière.
Scheduler : des tâches planifiées sans crontab externe
Le composant Scheduler permet de définir des tâches récurrentes directement en PHP, exécutées via le Messenger et un worker standard :
use Symfony\Component\Scheduler\Attribute\AsPeriodicTask;
#[AsPeriodicTask(frequency: '1 hour', schedule: 'default')]
final class CleanupExpiredTokens
{
public function __invoke(): void
{
// logique de nettoyage
}
}
Un seul cron système (messenger:consume scheduler_default) suffit alors à piloter toutes vos tâches, versionnées avec le code plutôt que dans une crontab séparée.
MapRequestPayload : des DTO validés sans code répétitif
L'attribut #[MapRequestPayload] désérialise et valide automatiquement le corps d'une requête vers un DTO immuable :
#[Route('/api/products', methods: ['POST'])]
public function create(
#[MapRequestPayload] CreateProductDto $dto
): JsonResponse {
return $this->json($dto, 201);
}
final class CreateProductDto
{
public function __construct(
#[Assert\NotBlank]
public readonly string $name,
#[Assert\Positive]
public readonly float $price,
) {}
}
Si la validation échoue, une 422 avec le détail des erreurs est renvoyée automatiquement, sans passer par un FormType.
Autres évolutions à surveiller (7.1 à 7.3)
- Composant Webhook et RemoteEvent pour standardiser la réception d'événements externes (Stripe, GitHub, Mailgun).
- Composant ObjectMapper (7.3) pour transformer un objet en un autre sans mapper manuel fastidieux.
JsonStreamerpour sérialiser de gros volumes de données sans tout charger en mémoire.- Amélioration continue du profiler et de la CLI
debug:pour inspecter autowiring et événements.