Cacher des données avec Symfony

Publié le 13/03/2022 • Mis à jour le 13/03/2022


English language detected! 🇬🇧

  We noticed that your browser is using English. Do you want to read this post in this language?

Read the english version 🇬🇧 Close

Dans ce bout de code, nous voyons comment cacher simplement des données avec Symfony. Celui-ci est pour moi, car j'oublie toujours comment faire. On doit injecter l'interface CacheInterface puis utiliser la fonction get() avec une fonction anonyme. C'est le moyen le plus direct. Dans cet exemple, le contenu caché dépend de la langue utilisée. Patientez cinq secondes et rafraichissez la page pour avoir une nouvelle valeur. Rafraichissez la page avant pour vérifier que le contenu caché est bien retourné. Utiliser un objet DateInterval est une bonne pratique et plus explicit que de passer un entier représentant un nombre de secondes. On peut fait aussi tout faire en une ligne comme montré dans le return commenté.


<?php

declare(strict_types=1);

namespace App\Controller\Snippet;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Contracts\Cache\CacheInterface;
use Symfony\Contracts\Cache\ItemInterface;

/**
 * J'utilise un trait PHP afin d'isoler chaque snippet dans un fichier.
 * Ce code doit être apellé d'un contrôleur Symfony étendant AbstractController (depuis Symfony 4.2)
 * ou Symfony\Bundle\FrameworkBundle\Controller\Controller (Symfony <= 4.1).
 * Les services sont injectés dans le constructeur du contrôleur principal.
 *
 * @property CacheInterface $cache
 */
trait Snippet192Trait
{
    public function snippet192(Request $request): void
    {
        $locale = $request->getLocale();

        $cached = $this->cache->get('random_cached_'.$locale, function (ItemInterface $item) use ($locale) {
            $item->expiresAfter(\DateInterval::createFromDateString('5 seconds'));

            echo "Generating new cache for '$locale'...".PHP_EOL;

            return $locale.'/'.random_int(0, 100000).'/Strangebuzz.com';

            // you can also use a one liner
            // return $item->expiresAfter(\DateInterval::createFromDateString('5 seconds'))->set($locale.'/'.random_int(0, 100000).'/Strangebuzz.com')->get();
        });

        echo 'cache value: '.$cached;

        // That's it! 😁
    }
}

 Exécuter le snippet  Plus sur Stackoverflow   Lire la doc  Plus sur le web  Snippet aléatoire