L'oracle des vents

Exercice 4 sur 6 du chapitre 9 · 280 XP · 5 objectifs vérifiés par des tests

Notions abordées : Décoration de service#[AsDecorator]#[AutowireDecorated]CacheCacheInterface

La volière affiche désormais les vents du jour vers trois contrées, lus par le mage de la tour. Ses prévisions sont justes, mais il met du temps à lire les astres et il facture chaque consultation. À chaque visite de la volière, trois consultations. Ouvrez l'aperçu et rechargez la page : regardez la facture grimper.

Or les vents ne changent qu'une fois par jour. Pipin propose de noter les réponses du mage dans un carnet. Mais on ne touche pas au mage, et on ne veut pas non plus modifier chaque endroit qui l'interroge.

Décorer un service

Le décorateur se glisse entre ceux qui demandent un service et le service lui-même. Il a la même interface (Oracle) : pour le contrôleur, rien ne change. À l'intérieur, il garde le service d'origine et décide quand l'appeler. Symfony fait l'échange : partout où l'on demandait Oracle, on reçoit le décorateur, qui reçoit à son tour le mage.

C'est ainsi que Symfony ajoute le profiler, les traces ou le cache autour de ses propres services, sans les modifier.

Votre mission

Écrivez OracleEnCache, le carnet de Pipin :

  1. c'est lui qu'on reçoit quand on demande un Oracle ;
  2. il répond exactement ce que le mage aurait dit ;
  3. il ne consulte le mage qu'une fois par contrée et par jour, même d'une requête à l'autre ;
  4. le lendemain, les vents changent : il consulte de nouveau.

Une fois le carnet en place, rechargez la volière : la facture du mage doit s'arrêter à 3.