Drupal 8 speichert Rest-API-Aufrufe zwischen

7

Ich verwende Drupal 8 im Headless-Modus mit Angular 8 als Client. Das Problem, mit dem ich konfrontiert bin, ist, dass Drupal die Anrufe an die Apis zwischenspeichert. Zum Beispiel habe ich einen Endpunkt, der davon ausgeht, dass Elemente in zufälliger Reihenfolge angegeben werden. Dies geschieht jedoch nicht. Ich erhalte nur Cache-Elemente in einer bestimmten Reihenfolge. Wie kann ich das überwinden? Ich habe versucht, Cache-Module zu deaktivieren, erhalte aber immer noch das gleiche Verhalten

user1648228
quelle

Antworten:

13

In Drupal gibt es zwei Ebenen des Caching.

1.) Dynamischer Seiten-Cache

Sie müssen die richtigen Cache-Metadaten für die JSON-Antwort angeben.

Verwenden Sie beispielsweise die Cache-Eigenschaften einer Konfigurations- oder Inhaltsentität

$response->addCacheableDependency($entitiy);

oder erstellen Sie ein zwischenspeicherbares Metadatenobjekt und fügen Sie dies der Antwort hinzu:

$build = [
  '#cache' => [
    'contexts' => ['url.query_args'],
    'tags' => ['node:1', 'node_list'],
    'max-age' => 300,
  ],
];
$cache_metadata = \Drupal\Core\Cache\CacheableMetadata::createFromRenderArray($build);
$response->addCacheableDependency($cache_metadata);

Sie können dies in einem benutzerdefinierten Controller verwenden oder in einem Ereignisabonnenten implementieren, um Antworten von anderen Modulen (Core oder Contrib) zu ändern.

2.) Interner Seiten-Cache

Das Modul Interner Seiten-Cache speichert alle Antworten für anonyme Anforderungen unabhängig von den Cache-Metadaten zwischen. Sie können dieses Modul deinstallieren, um diesen Cache zu deaktivieren.

Alternative Lösung

Fügen Sie auf der Clientseite jeder Anforderung eine andere Abfragezeichenfolge hinzu, um eine neue Antwort zu erhalten:

node/123?_format=json&time=123456789

Dadurch werden der interne Seitencache und Teile des dynamischen Seitencaches deaktiviert .

Referenz: https://www.drupal.org/docs/8/core/modules/rest/javascript-and-drupal-8-restful-web-services

4k4
quelle
1
Sie können den internen Seiten-Cache auch für bestimmte Routen mit \ Drupal :: service ('page_cache_kill_switch') -> trigger () deaktivieren. Und wenn drupal.org/node/2352009 reinkommt , wird auch das Höchstalter eingehalten .
Berdir
1
Ich musste Berdirs Vorschlag von \ Drupal :: service ('page_cache_kill_switch') hinzufügen -> trigger (); Ansonsten wird es immer noch für anonyme Benutzer für mich zwischengespeichert
Matt
5

Ich ziehe es vor, den Cache für meine Endpunkte vollständig zu deaktivieren. Sie können dem ResourceResponse- Objekt eine zwischenspeicherbare Abhängigkeit mit einem MaxAge-Wert von Null hinzufügen .

Hier ist ein Beispiel:

$response = new ResourceResponse($data);
$disable_cache = new CacheableMetadata();
$disable_cache->setCacheMaxAge(0);

$response->addCacheableDependency($disable_cache);

return $response;
Juanmi Sosso
quelle
Dies scheint eine großartige Idee für die Entwicklung zu sein, aber für einen Produktionsstandort möchten Sie die Parameter hinzufügen, die die Reaktion auf addCacheableDependencyIhren Standort variieren können, damit Ihr Standort leistungsfähiger / skalierbarer wird.
greggles