Sortie de Symfony 7.3 : plus de fonctionnalités que jamais !
Publié le 03 juin 2025
La version 7.3 du framework Symfony est sortie il y a quelques jours, et elle est déjà considérée par beaucoup comme l’une des meilleures versions jamais publiées. Symfony est un framework web libre et open source écrit en PHP permettant le développement d'applications web robustes et évolutives. Symfony est compatible avec une multitude de solutions libres telles que API Platform, Sylius, Laravel ou encore PrestaShop. Depuis sa création, Les-Tilleuls.coop contribue au développement de Symfony. En effet, notre Scop compte dans ses rangs deux membres de la Core Team, plusieurs contributeurs et contributrices réguliers ainsi qu’une quinzaine de personnes certifiées. Dans cet article, nous vous proposons d’explorer les principales nouveautés de cette version que nous avons, une fois de plus, choisi de sponsoriser.

Encore des nouveaux composants
Symfony est articulé autour de différents composants. Ces composants sont des bibliothèques autonomes que vous pouvez installer sur n’importe quel projet utilisant PHP, que vous utilisiez Symfony “le framework” ou non. Symfony “le framework” est ensuite la glue entre tous ces composants, proposant une expérience développeur (DX) dont on ne prouve plus l’efficacité.
L’introduction d’un composant fait toujours lieu à un long débat au sein de l’écosystème, afin de déterminer s’il a vraiment sa place ou non. Nous accueillons dans cette version mineure 7.3 deux nouveaux composants dits “expérimentaux”. Cela signifie que ces composants ne sont pas encore soumis à la promesse de rétrocompatibilité de Symfony et qu’il vaut mieux être prudent sur leur utilisation et ne pas trop coupler son application à ceux-ci avant qu’ils ne soient considérés comme stables. Ces deux nouveaux composants sont ObjectMapper et JsonPath, respectivement contribués par nos coopérateurs Antoine Bluchet et Alexandre Daubois. Pour en savoir plus sur ces composants, n’hésitez pas à lire les articles dédiés à ceux-ci. Pour vous épargner la recherche, voici l’article sur ObjectMapper et l’article sur JsonPath.
En parlant de composants, nous pouvons terminer cette section en annonçant que le composant JsonStreamer (anciennement appelé JsonEncoder pendant sa période expérimentale) est entré en phase stable et peut être utilisé sans retenue dans tous vos projets !
Commandes invocables
Voilà une autre nouveauté grandement attendue. Depuis plusieurs années, Symfony fait la part belle aux attributs introduits avec PHP 8.0 (en témoigne la page dédiée aux attributs Symfony), notamment sur les classes invocables. Depuis près de 10 ans, il est par exemple possible de déclarer des contrôleurs avec une seule méthode, __invoke()
. Il était tout de même nécessaire de définir la classe comme contrôleur, par exemple en étendant AbstractController
. Cela a été grandement simplifié depuis l’ajout des attributs et cette extension n’est plus nécessaire si vous utilisez l’attribut #[AsController]
. Le contrôleur est alors invoqué par le kernel et votre classe est réduite au strict minimum, pour une lisibilité maximale : une méthode, un attribut.
Il est désormais possible, depuis Symfony 7.3, d’effectuer la même chose avec les commandes !
use Symfony\Component\Console\Attribute\Argument;
use Symfony\Component\Console\Attribute\Option;
use Symfony\Component\Console\Command;
use Symfony\Component\Console\Style\SymfonyStyle;
#[AsCommand(name: 'app:user:rgpd-report')]
class CreateUserCommand
{
public function __invoke(
SymfonyStyle $io,
#[Argument] string $userName,
#[Option] bool $includeTimestamps = false,
): int
{
// ...
return Command::SUCCESS;
}
}
Il n’est désormais plus nécessaire d’étendre la classe Command
ni de définir les arguments et options de la commande de manière verbeuse dans une méthode configure()
.
Précompression des Assets
La gestion des assets est un véritable challenge pour tout site, et l’économie de bande passante vis-à-vis de ceux-ci est un point critique, tant du point de vue de la performance que dans une démarche d’éco-conception. Pour cela, les assets (scripts, images, …) sont en général compressés avant d’être envoyés. Malheureusement, cela se fait à la volée au moment de la requête, prenant du temps processeur et allongeant le temps de réponse. Notre coopérateur Kévin Dunglas a contribué une nouvelle fois au framework pour ajouter une fonctionnalité de précompression lors de la phase de build de votre application. Si vous utilisez AssetMapper, vous pouvez désormais ajouter une nouvelle option dans votre configuration :
# config/packages/asset_mapper.yaml
framework:
asset_mapper:
precompress:
# possible values: 'brotli', 'zstandard', 'gzip'
format: 'zstandard'
Vos assets seront désormais compressés au moment du warm up du cache, en général effectué à chaque déploiement. Si votre serveur web supporte cette option (c’est le cas, par exemple, de FrankenPHP et de Caddy ou de NGINX), les versions compressées des assets seront alors toujours disponibles et prêtes à être servies aux clients, sans temps CPU supplémentaire.
Retrouvez tous les détails concernant cette fonctionnalité, et la compression web en général, dans cette présentation donnée par Kévin lors de la SymfonyCon Vienne.
Étendez Twig encore plus facilement
Dans la même veine que les commandes, la définition des filtres et des fonctions Twig est devenue encore plus rapide qu’avant grâce à l’introduction de deux nouveaux attributs : #[AsTwigFunction]
et #[AsTwigFilter]
. Pour cela, il suffit de placer l’un des deux attributs au dessus d’une méthode et le framework s’occupe du reste :
namespace App\Twig;
use Twig\Attribute\AsTwigFilter;
class AppExtension
{
#[AsTwigFilter('custom_currency')]
public function formatCustomCurrency(int $price): string
{
// ...
}
}
Les Server-Sent Events au Coeur du PHP moderne
Les Server-Sent Events, ou SSE, sont des données transmises du serveur au client sans requête préalable, grâce à une connexion maintenue ouverte. Cela permet au serveur d’envoyer des mise à jour au client sans qu’il les demande, et donc de recevoir des données en temps réel. Mercure, développé par notre coopérateur Kévin Dunglas et sponsorisé par Les-Tilleuls.coop, est le choix favoris en termes de hub SSE.
Même si Mercure reste la solution idéale et recommandée par Symfony pour l’envoie de SSE, il existe des cas simples qui ne nécessitent pas de maintenir de connexions persistantes, pour lesquels générer les SSE directement en PHP est acceptable.
Par exemple, lorsqu’un traitement lourd et long est effectué de manière synchrone, envoyer régulièrement des SSE au client est une manière simple et efficace de le notifier de l’avancement du processus.
Dans Symfony 7.3, un nouveau type de réponse est ajouté au framework : EventStreamResponse
. Plus de code spécifique parfois assez long pour envoyer vos événements, tout se fait dans une closure donnée à ce nouveau type de réponse :
public function __invoke(): EventStreamResponse
{
return new EventStreamResponse(function () {
foreach ($this->quelqueChoseDeLong() as $restant) {
yield new ServerEvent(json_encode(['remainining' => $restant]));
}
});
}
Expliquez pourquoi un accès est refusé
Lorsqu’on utilise des voters dans Symfony pour gérer les accès aux différentes parties de l’application, il est parfois compliqué d’expliquer ce qui s’est exactement passé et pourquoi la décision d’accès a été rejetée.
Symfony 7.3 introduit la possibilité d’ajouter la raison d’un refus d’un vote. Cela permet d’indiquer précisément à l’utilisateur pourquoi l’accès est refusé. Une excellente nouvelle pour l’amélioration de l’expérience utilisateur dans vos applications !
namespace App\Security\Voter;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Vote;
use Symfony\Component\Security\Core\Authorization\Voter\Voter as BaseVoter;
class BlogCommentVoter extends BaseVoter
{
// ...
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool
{
// ...
if (...) {
$vote?->addReason('You cannot access this part because you are not an admin');
return false;
}
if (...) {
$vote?->addReason('You are an admin indeed, but you are not a SUPER admin! Contact the support to get this right');
return false;
}
return true;
}
}
Et encore beaucoup d’autres
Comme expliqué en début d’article, cette version de Symfony est déjà considérée comme l’une des plus réussies sur les 20 dernières années du framework tant les nouveautés sont riches. Il y a encore des dizaines de nouvelles fonctionnalités qui pourraient être présentées : le support natif des DatePoint
avec Doctrine, le support des objets paresseux au sein du framework (les lazy ghosts et virtual proxies), le support des unions dans OptionsResolver ou les différentes améliorations sur la gestion du YAML ou des énumérations dans les arbres de configuration. Inutile d’indiquer que le développement du framework bat son plein et que ce n’est apparemment pas prêt de s’arrêter ! Que vous cherchiez à monter en compétences sur Symfony, à renforcer votre équipe de développement ou à bénéficier de l’expertise de nos architectes, faites appel à l’excellence de notre équipe certifiée, contributrice de longue date et membre de sa Core Team !