Drupal 8 & Drupal 9 - Exemple d'utilisation simple du cache

Posté le Mercredi 15 mai 2019 - 12:18
Dernière mise à jour le Mercredi 13 janvier 2021 - 11:40

Drupal 8 propose un système de cache très puissant et à plusieurs niveaux.

Ici nous allons voir comment stocker simplement le résultat d'une requête en cache afin de ne pas avoir à la lancer la requête SQL à chaque appel.

Commençons par définir notre « conteneur » de cache dans le fichier mon_module.services.yml :

  cache.mon_module:
    class: Drupal\Core\Cache\CacheBackendInterface
    tags:
      - { name: cache.bin }
    factory: cache_factory:get
    arguments: [mon_module]

mon_module sera le nom de notre conteneur de cache.

Cela permettra de distinguer les données que nous mettrons dedans et de ne pas écraser d'autres caches d'autres modules. Si vous utilisez le cache en base de données (par défaut) vous verrez qu'une nouvelle table cache_mon_module a été créée.

Ensuite voici un exemple de lecture du cache, et d'écriture si la donnée n'est pas présente :

public function getVersion() {
  // On teste si la clé « database.version » est présente dans le conteneur de cache « mon_module »
  if ($results = \Drupal::cache('mon_module')->get('database.version')) {
    // Si c'est le cas, les données stockées sont dans l'attribut « data »
    return $results->data;
  }
  // Sinon on effectue la requête désirée
  $version = $this->connection->select('version', 'v')->fields('v', ['version'])->execute()->fetch();
  // Et on met la valeur en cache
  \Drupal::cache('mon_module')->set('database.version', $version->version);

  return $version->version;
}

 

Expiration du cache

Il est possible aussi de donner date d'expiration afin que cette clé de cache ne soit plus valable une fois cette date passée :

// cache valable 1 h (3600 secondes)
\Drupal::cache('mon_module')->set('database.version', $version->version, date('U') + 3600);

 

Ajouter un cache tag

Il est possible d'ajouter aussi un tag à notre valeur cachée, afin de pouvoir l'invalider si besoin :

// cache valable 1 h (3600 secondes) avec tag de cache « db »
\Drupal::cache('mon_module')->set('database.version', $version->version, date('U') + 3600, ['db']);

Il est possible de définir un cache permanent qui ne sera supprimé que s'il est invalidé


\Drupal::cache('mon_module')->set('fermetures', $results, Cache::PERMANENT, ['horaires']);

 

Invalidation du cache

L'invalidation se fera avec l'appel suivant :

// Invalidation du cache tag « db »
\Drupal\Core\Cache\Cache::invalidateTags(['db']);

Il est possible d'invalider plusieurs tag de cache à la fois :

// Invalidation des cache tags « db » et « horaires »
\Drupal\Core\Cache\Cache::invalidateTags(['db', 'horaires']);

 

Aller plus loin ?

 

Ajouter un commentaire

Ne sera pas publié

CAPTCHA Désolé, pour ça, mais c'est le seul moyen pour éviter le spam...