Cache Symfony : get(), rappel et choix de la clé
Le cache de Symfony garde sous une clé le résultat d'un calcul coûteux, pour ne le refaire que lorsque la clé change ou que l'entrée expire.
public function __construct( private readonly CacheInterface $cache, private readonly ClockInterface $horloge, ) { } public function ventsDuJour(string $contree): string { // Une clé par contrée et par jour : le lendemain, la clé change et le mage est consulté de nouveau. $cle = sprintf('vents-%s-%s', md5($contree), $this->horloge->now()->format('Y-m-d')); return $this->cache->get($cle, fn () => $this->mage->ventsDuJour($contree)); }
On reçoit Symfony\Contracts\Cache\CacheInterface par autowiring, c'est-à-dire le pool cache.app. Sa méthode get() prend une clé et un rappel : si la clé est en cache, le rappel n'est pas appelé ; sinon, il calcule la valeur, qui est stockée puis rendue. Le cache survit d'une requête à l'autre. Une clé refuse les caractères {}()/\@:, d'où le md5() sur une valeur libre. Pour une durée de vie, le rappel reçoit un ItemInterface et appelle expiresAfter(). Le piège tient à la clé : trop fine, avec l'heure et la minute par exemple, elle change sans cesse et le cache ne sert jamais, sans aucune erreur ; trop large, elle sert une valeur périmée.
Les exercices font retenir les prévisions d'un mage qui facture chaque consultation, une fois par contrée et par jour ; puis comprendre, dans une taverne déréglée, pourquoi sa facture repart à la hausse.
2 exercices font travailler cette notion, en écrivant du code dans le navigateur.
Dans les parcours
- L'oracle des vents Symfony pour les devs PHP · chapitre 9 : Les rouages de la taverne
- 🐉 Boss : la taverne à l'envers Symfony pour les devs PHP · chapitre 9 : Les rouages de la taverne