¿Cómo deshabilito Twig y bloqueo de caché para un módulo específico?

15

Estoy trabajando en un módulo en Drupal 8 que recupera datos sensibles al tiempo de una API REST externa. Los datos se procesan y se envían a un bloque. Los datos finales se envían a una plantilla Twig de la siguiente manera:

...

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

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

  return $build;
}

Esto no funciona en el entorno de producción donde la memoria caché está habilitada y los datos representados se muestran obsoletos. ¿Cómo deshabilito la memoria caché solo para mi módulo y debo hacerlo tanto para la plantilla Twig como para el complemento Block?

estrar
fuente

Respuestas:

27

Puede controlar el caché en la matriz de renderizado con el elemento #cache.

Para deshabilitar el caché agregue:

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

En este caso, el bloque no se almacenará en caché para usuarios registrados o usuarios anónimos con una sesión.

Si desea deshabilitar el caché para usuarios anónimos sin una sesión:

Deshabilítelo desinstalando el módulo page_cache por completo o activando el interruptor de apagado, consulte ¿Cómo puedo evitar que una página en particular se almacene en caché? por ejemplo.

El almacenamiento en caché del código de ramita no está conectado a esto, el código de ramita solo se almacena en caché una vez, la primera vez que se usa después de borrar el caché.

(editar según los comentarios de Berdir)

4k4
fuente
Supongo que un contexto de caché no ayudará en este caso específico, pero tal vez desee usar una edad máxima real en lugar de 0 que deshabilitó el almacenamiento en caché por completo, como 60. No estoy seguro de cuán sensibles al tiempo son sus datos, pero por lo general, las cosas pueden ser almacenado en caché por un minuto o unos pocos. Además, tenga en cuenta que max-age no afecta la memoria caché de la página anónima. Si necesita esto para usuarios anónimos, debe deshabilitarlo por completo o recuperar los datos mediante javascript.
Berdir
@ Berdir: uso max-age = 0 para usuarios anónimos, pero con sesiones. Esto está funcionando ahora en dev. ¿Crees que esto está bien para la producción? ¿Qué quieres decir con desactivar por completo?
4k4
Está bien si tienes sesiones, entonces funciona. Deshabilítelo desinstalando el módulo page_cache por completo o activando el interruptor de apagado, consulte drupal.stackexchange.com/questions/151254/… por ejemplo.
Berdir
Gracias por la gran información, he agregado esto en la respuesta.
4k4
1
$ build ['# caché'] ['max-age'] = 0; Hizo el truco !!! Cervezas todo el año! :)
Sorin
6

Para detener el almacenamiento en caché de un bloque específico, use la siguiente función:

/**
 * 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
fuente
Excelente respuesta
Alumno
2

Deshabilitar el caché para una página / tipo de contenido / controlador específico

Deshabilite el caché para una página personalizada desde la declaración de ruta.

Si desea deshabilitar la memoria caché para un controlador personalizado (módulo personalizado), tiene la no_cacheopción (YOUR_MODULE.routing.yml). Ejemplo: Archivo: 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'

Se agregó la opción de ruta 'no_cache' para marcar las respuestas de una ruta como no almacenables en caché

Vladislav
fuente
0

Para evitar el almacenamiento en caché de un bloque en particular:

agregue el siguiente código en el archivo theme_name.theme

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

Para deshabilitar el caché para un tipo de bloque, preprocese el bloque de ese tipo y establezca max_age en 0.

   /**
     * Implements hook_preprocess_HOOK() for Block document templates.
     */
    function THEMENAME_preprocess_block(array &$variables) {

      //disbale cache from spotlight
      $content = $variables['elements']['content'];
      //dump($content); //check the contents
      if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {

        if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
          $variables['#cache']['max-age'] = 0;
        }

      }


    }
Wasim Khan
fuente