Implementando cache no Drupal 7 e 8 via programação

Hoje vou mostrar à vocês, como fazer armazenamento em cache via programação no Drupal 7 e Drupal 8.

No Drupal 7, utilizaremos as funções cache_set e cache_get.

No Drupal 8, as funções cache_set e cache_get foram substituídas por "\Drupal::cache()->set()" e "\Drupal::cache()->get()". Para mais detalhes sobre a documentação do Cache API no Drupal 8, click aqui.

No exemplo abaixo, criei uma listagem de usuários, onde a primeira consulta será feita utlizando o db_select.
Feita a primeira consulta, os dados serão armazenados em cache. Assim, as próximas requisições serão feitas diretamente do cache.

Exemplo no Drupal 7:

function _listUser(){
    $dataListUser = &drupal_static(__FUNCTION__);
 
    if(!isset($dataListUser)){
        if($cache = cache_get('ListUserCache')){
            var_dump('Retorno com Cache');
            $dataListUser = $cache->data;
        }
        else {
            var_dump('Primeiro Retorno sem Cache');
            $dataListUser = _queryUser();
 
            //cache_set('idDoCache','ConteúdoCache','TipoCache','TempoCache');
            cache_set('ListUserCache', $dataListUser, 'cache', 3600);
        }
    }
    return $dataListUser;
}
 
function _queryUser(){
    $result = db_select('users', 'u')->fields('u', array('name'))->execute();
    while($record = $result->fetchAssoc()) {
        $data[] = $record['name'];
    }
    return $data;
}
 
var_dump(_listUser());


Exemplo no Drupal 8:

use Drupal\Core\Cache\Cache;

function _listUser(){
  $dataListUser = &drupal_static(__FUNCTION__);

    if(!isset($dataListUser)){
      if($cache = \Drupal::cache()->get('ListUserCache')){
        var_dump('Retorno com Cache');
        $dataListUser = $cache->data;
      }
      else {
        var_dump('Primeiro Retorno sem Cache');
        $dataListUser = _queryUser();

        \Drupal::cache()->set('ListUserCache', $dataListUser, Cache::PERMANENT,array('tag1', 'tag2'));
      }
  }
  return $dataListUser;
}

function _queryUser(){
  $result = db_select('users_field_data', 'u')->fields('u', array('name'))->execute();
  while($record = $result->fetchAssoc()) {
    $data[] = $record['name'];
  }
  return $data;
}

var_dump(_listUser());

Para especificar a tabela onde o cache será salvo no Drupal 8, você deverá implementar um "services". Veja mais detalhes sobre services aqui!
Crie um arquivo dentro do seu módulo, chamado "namemodule.services.yml". E nele, informe o nome da tabela. No exemplo abaixo, utilizei o nome "mycache":

services:
  cache.mycache:
    class: Drupal\Core\Cache\CacheBackendInterface
    tags:
      - { name: cache.bin }
    factory_method: get
    factory_service: cache_factory
    arguments: [mycache]

Após implementar o services, no método "cache", especifique o nome da tabela. 

\Drupal::cache('mycache')->get('ListUserCache');
\Drupal::cache('mycache')->set('ListUserCache', $dataListUser, Cache::PERMANENT,array('tag1', 'tag2'));

 

Até o próximo Post!