Comment désactiver Twig et bloquer le cache pour un module spécifique?


15

Je travaille sur un module dans Drupal 8 qui récupère les données sensibles au temps à partir d'une API REST externe. Les données sont traitées et transmises à un bloc. Les données finales sont envoyées à un modèle Twig comme ceci:

...

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

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

  return $build;
}

Cela ne fonctionne pas sur l'environnement de production où le cache est activé et les données rendues apparaissent comme périmées. Comment désactiver le cache pour mon module uniquement, et dois-je le faire pour le modèle Twig et le plugin Block?

Réponses:


27

Vous pouvez contrôler le cache dans le tableau de rendu avec l'élément #cache.

Pour désactiver le cache, ajoutez:

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

Dans ce cas, le bloc ne sera pas mis en cache pour les utilisateurs connectés ou les utilisateurs anonymes avec une session.

Si vous souhaitez désactiver le cache pour les utilisateurs anonymes sans session:

Désactivez-le en désinstallant complètement le module page_cache ou en déclenchant le kill switch, voir Comment puis-je empêcher la mise en cache d'une page particulière? par exemple.

La mise en cache du code de brindille n'est pas connectée à cela, le code de brindille n'est mis en cache qu'une seule fois, la première fois qu'il est utilisé après avoir effacé le cache.

(modifier selon les commentaires de Berdir)


Je suppose qu'un contexte de cache n'aidera pas dans ce cas spécifique, mais peut-être que vous souhaitez utiliser un âge maximal réel au lieu de 0 qui a complètement désactivé la mise en cache, comme 60. Je ne sais pas à quel point vos données sont sensibles au temps, mais généralement, les choses peuvent être mis en cache pendant une minute ou quelques-uns. Notez également que max-age n'affecte pas le cache de page anonyme. Si vous en avez besoin pour les utilisateurs anonymes, vous devez le désactiver complètement ou récupérer les données à l'aide de javascript.
Berdir

@Berdir: J'utilise le max-age = 0 pour les utilisateurs anonymes, mais avec des sessions. Cela fonctionne maintenant en dev. Pensez-vous que c'est OK pour la production? Que voulez-vous dire par désactiver complètement?
4k4

C'est bien si vous avez des sessions, alors ça marche. Désactivez-le soit en désinstallant complètement le module page_cache ou en déclenchant le kill switch, voir drupal.stackexchange.com/questions/151254/… par exemple.
Berdir

Merci pour la grande info, j'ai ajouté ceci dans la réponse.
4k4

1
$ build ['# cache'] ['max-age'] = 0; a fait l'affaire !!! Des bières tout autour! :)
Sorin

6

Pour arrêter la mise en cache d'un bloc spécifique, utilisez la fonction suivante:

/**
 * 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;
  }
}

Excellente réponse.
Elève

2

Désactiver le cache pour une page / un type de contenu / un contrôleur spécifique

Désactivez le cache pour une page personnalisée à partir de la déclaration de route.

Si vous souhaitez désactiver le cache pour un contrôleur personnalisé (module personnalisé), vous avez l' no_cacheoption (YOUR_MODULE.routing.yml). Exemple: Fichier: 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'

Ajout de l'option de route «no_cache» pour marquer les réponses d'un itinéraire comme non pouvant être mises en cache


0

Pour empêcher la mise en cache d'un bloc particulier:

ajoutez le code ci-dessous dans le fichier theme_name.theme

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

0

Pour désactiver le cache pour un type de bloc, prétraitez le bloc de ce type et définissez max_age sur 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;
        }

      }


    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.