Wie kann ich verhindern, dass eine bestimmte Seite zwischengespeichert wird?


14

Ich habe den Cache auf meiner Drupal 8-Site aktiviert und natürlich werden alle Seiten wie erwartet zwischengespeichert.

Ich möchte jedoch, dass eine bestimmte Seite diesen Cache umgeht.

In meinem Controller habe ich die Seite wie folgt erstellt:

public function myPage() {
  return [
    '#markup' => time(),
  ];
}

Wie kann ich Drupal anweisen, meine Seite nicht im Cache zu speichern?

Antworten:


30

Für Drupal 7:

Drupal hat die Funktion drupal_page_is_cacheable (), mit der eine Seite auf nicht zwischenspeicherbar gesetzt werden kann.

Hier ist die Dokumentation: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Für Drupal 8:

// Deny any page caching on the current request.    
\Drupal::service('page_cache_kill_switch')->trigger();

Dann lautet der Code:

public function myPage() {
  \Drupal::service('page_cache_kill_switch')->trigger();
  return [
    '#markup' => time(),
  ];
}

Bereinigen Sie Ihren Cache wie gewohnt .


18

Cache für eine bestimmte Seite deaktivieren

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


10

In Drupal 8 können Sie den Cache als maximales Alter angeben, bis Ihre Seitenausgabe zwischengespeichert werden soll. Schreiben Sie, um den Cache einer bestimmten Seite (Controllerseite) zu entfernen 'max-age' => 0,.

public function myPage() {
  return [
   '#markup' => time(),
   '#cache' => ['max-age' => 0,],    //Set cache for 0 seconds.
  ];
} 

2

Wenn Sie etwas mit einem Contrib-Modul tun müssen, können Sie das Cache-Problem mit einem RouteSubscriber beheben. Sie brauchen einen Dienst ... oder einfach laufen, drupal grwenn Sie eine Drupal-Konsole haben.

 namespace Drupal\mymodule\Routing;

 use Drupal\Core\Routing\RouteSubscriberBase;
 use Symfony\Component\Routing\RouteCollection;

 class RouteSubscriber extends RouteSubscriberBase {

/**
 * {@inheritdoc}
 */
protected function alterRoutes(RouteCollection $collection) {
  // Find the route you need ...
  if ($route = $collection->get('some.contrib.route')) {
    $options = $route->getOptions();
    $options['no_cache'] = TRUE;
    $route->setOptions($options);
  }
 }
}

Weitere Informationen finden Sie unter https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


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.