Wie deaktiviere ich Twig und blockiere den Cache für ein bestimmtes Modul?


15

Ich arbeite an einem Modul in Drupal 8, das zeitkritische Daten von einer externen REST-API abruft. Die Daten werden verarbeitet und an einen Block weitergeleitet. Die endgültigen Daten werden wie folgt an eine Twig-Vorlage gesendet:

...

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

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

  return $build;
}

Dies funktioniert nicht in der Produktionsumgebung, in der der Cache aktiviert ist und die gerenderten Daten als veraltet angezeigt werden. Wie deaktiviere ich den Cache nur für mein Modul und muss ich ihn sowohl für die Twig-Vorlage als auch für das Block-Plugin ausführen?

Antworten:


27

Sie können den Cache im Render-Array mit dem Element #cache steuern.

So deaktivieren Sie den Cache:

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

In diesem Fall wird der Block nicht für angemeldete Benutzer oder anonyme Benutzer mit einer Sitzung zwischengespeichert.

Wenn Sie den Cache für anonyme Benutzer ohne Sitzung deaktivieren möchten:

Deaktivieren Sie es, indem Sie das page_cache-Modul vollständig deinstallieren oder den Kill-Schalter auslösen. Siehe Wie kann ich verhindern, dass eine bestimmte Seite zwischengespeichert wird? beispielsweise.

Das Zwischenspeichern des Zweigcodes ist damit nicht verbunden, der Zweigcode wird nur einmal zwischengespeichert, das erste Mal, wenn Sie den Cache geleert haben.

(nach Kommentaren von Berdir editieren)


Ich nehme an, ein Cache-Kontext hilft in diesem speziellen Fall nicht weiter, aber vielleicht möchten Sie ein tatsächliches Maximalalter anstelle von 0 verwenden, wodurch das Caching vollständig deaktiviert wird, z für eine Minute oder ein paar zwischengespeichert werden. Beachten Sie außerdem, dass das maximale Alter den anonymen Seitencache nicht beeinflusst. Wenn Sie dies für anonyme Benutzer benötigen, müssen Sie dies vollständig deaktivieren oder die Daten mit Javascript abrufen.
Berdir

@Berdir: Ich benutze das max-age = 0 für anonyme Benutzer, aber mit Sessions. Das funktioniert jetzt in dev. Denken Sie, dass dies für die Produktion in Ordnung ist? Was meinst du mit komplett deaktivieren?
4. April,

Es ist in Ordnung, wenn Sie Sitzungen haben, dann funktioniert es. Deaktivieren Sie es, indem Sie das page_cache-Modul vollständig deinstallieren oder den Kill-Schalter auslösen (siehe z. B. drupal.stackexchange.com/questions/151254/…) .
Berdir

Vielen Dank für die tolle Info, ich habe dies in der Antwort hinzugefügt.
4. April,

1
$ build ['# cache'] ['max-age'] = 0; hat den Trick gemacht !!! Bier rundum! :)
Sorin

6

So beenden Sie das Zwischenspeichern eines bestimmten Blocks:

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

  }

Hervorragende Antwort.
Schüler

2

Deaktivieren Sie den Cache für eine bestimmte Seite / einen bestimmten Inhaltstyp / einen bestimmten Controller

Deaktivieren Sie den Cache für eine benutzerdefinierte Seite in der Routendeklaration.

Wenn Sie den Cache für einen benutzerdefinierten Controller (benutzerdefiniertes Modul) deaktivieren möchten, haben Sie die no_cacheOption (YOUR_MODULE.routing.yml). Beispiel: Datei: 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'

Die Routenoption 'no_cache' wurde hinzugefügt, um die Antworten einer Route als nicht zwischenspeicherbar zu markieren


0

So verhindern Sie das Zwischenspeichern eines bestimmten Blocks:

Fügen Sie den folgenden Code in die Datei theme_name.theme ein

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.