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']);
Ajouter un commentaire