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.