Como desativo o Twig e bloqueio o cache para um módulo específico?

15

Estou trabalhando em um módulo no Drupal 8 que recupera dados sensíveis ao tempo de uma API REST externa. Os dados são processados ​​e encaminhados para um bloco. Os dados finais são enviados para um modelo Twig da seguinte forma:

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

Isso não funciona no ambiente de produção em que o cache está ativado e os dados renderizados aparecem como obsoletos. Como desabilito o cache apenas para o meu módulo e preciso fazê-lo para o modelo Twig e o plug-in Block?

estrar
fonte

Respostas:

27

Você pode controlar o cache na matriz de renderização com o elemento #cache.

Para desativar o cache, adicione:

$build['#cache']['max-age'] = 0;

Nesse caso, o bloco não será armazenado em cache para usuários conectados ou usuários anônimos com uma sessão.

Se você deseja desativar o cache para usuários anônimos sem uma sessão:

Desative-o desinstalando o módulo page_cache completamente ou acionando a opção kill, consulte Como posso impedir que uma página específica seja armazenada em cache? por exemplo.

O armazenamento em cache do código do galho não está conectado a isso, o código do galho é armazenado em cache apenas uma vez, na primeira vez em que é usado após a limpeza do cache.

(editar de acordo com comentários de Berdir)

4k4
fonte
Suponho que um contexto de cache não ajude nesse caso específico, mas talvez você queira usar uma idade máxima real em vez de 0, que desabilitou completamente o cache, como 60. Não tenho certeza de quanto tempo seus dados são sensíveis, mas geralmente as coisas podem em cache por um minuto ou alguns. Além disso, observe que a idade máxima não afeta o cache da página anônima. Se você precisar disso para usuários anônimos, precisará desativá-lo completamente ou buscar os dados usando javascript.
Berdir
@ Berdir: Eu uso o max-age = 0 para usuários anônimos, mas com sessões. Isso está funcionando agora no dev. Você acha que isso é bom para produção? O que você quer dizer com desativar completamente?
4k4
Tudo bem se você tiver sessões, então funciona. Desative-o desinstalando o módulo page_cache completamente ou acionando a opção kill, consulte drupal.stackexchange.com/questions/151254/… por exemplo.
Berdir
Obrigado pela ótima informação, eu adicionei isso na resposta.
4k4
1
$ build ['# cache'] ['idade máxima'] = 0; fez o truque !!! Cervejas todo! :)
Sorin
6

Para parar de armazenar em cache um bloco específico, use a seguinte função:

/**
 * Implements hook_preprocess_HOOK() for block.html.twig.
 */
function template-name_preprocess_block(&$vars) {
  if($vars['derivative_plugin_id'] == 'add-block-id-name') {
    //-- This stops the block being cache in drupal 8
    $vars['#cache']['max-age'] = 0;
  }
}
eco
fonte
Excelente resposta.
Aluno
2

Desativar cache para uma página / tipo de conteúdo / controlador específico

Desative o cache para uma página personalizada da declaração de rota.

Se você deseja desativar o cache para um controlador personalizado (módulo Personalizado), você tem a no_cacheopção (YOUR_MODULE.routing.yml). Exemplo: Arquivo: mymodule.routing.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

Adicionada a opção de rota 'no_cache' para marcar as respostas de uma rota como inatingíveis

Vladislav
fonte
0

Para impedir o armazenamento em cache de um bloco específico:

adicione o código abaixo no arquivo theme_name.theme

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
Rimi B
fonte