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;
}
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);