Come disabilitare Twig e bloccare la cache per un modulo specifico?


15

Sto lavorando su un modulo in Drupal 8 che recupera i dati sensibili al tempo da un API REST esterno. I dati vengono elaborati e inoltrati a un blocco. I dati finali vengono inviati a un modello Twig in questo modo:

...

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

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

  return $build;
}

Questo non funziona nell'ambiente di produzione in cui la cache è abilitata e i dati renderizzati vengono visualizzati come obsoleti. Come disabilitare la cache solo per il mio modulo e devo farlo sia per il modello Twig che per il plug-in Block?

Risposte:


27

È possibile controllare la cache nell'array di rendering con l'elemento #cache.

Per disabilitare la cache aggiungere:

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

In questo caso il blocco non verrà memorizzato nella cache per gli utenti che hanno effettuato l'accesso o gli utenti anonimi con una sessione.

Se si desidera disabilitare la cache per utenti anonimi senza una sessione:

Disabilitalo disinstallando completamente il modulo page_cache o attivando il kill switch, vedi Come posso evitare che una determinata pagina venga memorizzata nella cache? per esempio.

La memorizzazione nella cache del codice del ramoscello non è collegata a questo, il codice del ramoscello viene memorizzato nella cache solo una volta, la prima volta che viene utilizzato dopo aver svuotato la cache.

(modifica secondo i commenti di Berdir)


Suppongo che un contesto di cache non sia di aiuto in questo caso specifico, ma forse si desidera utilizzare un limite massimo effettivo invece di 0 che disabilita completamente la memorizzazione nella cache, come 60. Non sono sicuro di quanto siano sensibili i dati nel tempo, ma di solito le cose possono essere memorizzato nella cache per un minuto o alcuni. Inoltre, tieni presente che max-age non influisce sulla cache della pagina anonima. Se questo è necessario per utenti anonimi, è necessario disabilitarlo completamente o recuperare i dati utilizzando JavaScript.
— Berdir,

@Berdir: utilizzo max-age = 0 per utenti anonimi, ma con sessioni. Questo funziona ora in sviluppo. Pensi che sia OK per la produzione? Cosa intendi con disabilita completamente?
— 4k4,

Va bene se hai sessioni, allora funziona. Disabilitalo disinstallando completamente il modulo page_cache o attivando il kill switch, vedi ad esempio drupal.stackexchange.com/questions/151254/… .
— Berdir,

Grazie per le ottime informazioni, l'ho aggiunto nella risposta.
— 4k4

1
$ build ['# cache'] ['max-age'] = 0; fatto il trucco !!! Birre a tutto tondo! :)
— Sorin,

6

Per interrompere la memorizzazione nella cache di un blocco specifico, utilizzare la seguente funzione:

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

Risposta eccellente.
— Allievo

2

Disabilita la cache per una specifica pagina / tipo di contenuto / controller

Disabilita la cache per una pagina personalizzata dalla dichiarazione del percorso.

Se si desidera disabilitare la cache per un controller personalizzato (modulo personalizzato), è disponibile l' no_cacheopzione (YOUR_MODULE.routing.yml). Esempio: file: 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'

Aggiunta l'opzione di route 'no_cache' per contrassegnare le risposte di una route come non modificabili


0

Per impedire la memorizzazione nella cache di un determinato blocco:

aggiungi il codice seguente nel file theme_name.theme

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

0

Per disabilitare la cache per un tipo di blocco, preelaborare il blocco di quel tipo e impostare max_age su 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;
        }

      }


    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.