web-dev-qa-db-fra.com

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

Je travaille sur un module dans Drupal 8 qui récupère les données sensibles au temps d'une externe REST api. Les données sont traitées et transmises à un bloc. Le 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 s'affichent 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 plug-in Block?)

15
estrar

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 soit 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 twig n'est pas connectée à cela, le code twig 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)

27
4k4

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;
  }
}
6
echo

Désactiver le cache pour une page/type de contenu/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 no_cache option (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'une route comme non mise en cache

3
Vladislav

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

      }


    }
0
Wasim Khan

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
Rimi B