Mit dem Drupal Console- Befehl dieses Tutorialsdrupal gprr
habe ich in Drupal 8 eine benutzerdefinierte REST-Ressource erstellt. Mit dieser Ressource kann ich ein einfaches JSON-Objekt abrufen, das den aktuellen Benutzer begrüßt, indem ich ein GET für Folgendes ausführe:
http://localhost/example/hello?_format=json
Der zurückgegebene JSON sieht dann folgendermaßen aus:
{ "hello": "tyler" }
Dies ist zu erwarten, da ich angemeldet bin. Wenn ich mich jedoch abmelde und ein weiteres GET für die Ressource durchführe, wird dasselbe Ergebnis zurückgegeben :
{ "hello": "tyler" }
Durch das Löschen eines vollständigen Drupal-Cache wird dieses Problem behoben, aber ich möchte das Caching für diese Ressource speziell deaktivieren. Wie kann ich das machen?
Als Problemumgehung dachte ich, dass das Hinzufügen eines Zeitstempels zur Abfragezeichenfolge funktionieren würde:
http://localhost/example/hello?_format=json&time=123456789
Dies liefert jedoch auch genau das gleiche Ergebnis , unabhängig davon, welcher Zeitstempelwert in der Abfragezeichenfolge enthalten ist.
Der Kürze halber ist hier der Grundgerüstcode zum Erstellen der GET-Ressource:
class ExampleHello extends ResourceBase {
/**
* {@inheritdoc}
*/
public static function create(/* ... */) {
return new static(/* ... */);
}
/**
* Constructs a Drupal\rest\Plugin\ResourceBase object.
*/
public function __construct(/* ... */) {
parent::__construct(/* ... */);
// ...
}
/*
* Responds to GET requests.
*/
public function get() {
$account = \Drupal::currentUser()->getAccount();
if (!$account->id()) {
return new ResourceResponse(array(
'welcome' => 'visitor'
));
}
return new ResourceResponse(array(
'hello' => $account->getAccountName()
));
}
}
Gibt es eine Konfiguration / Einstellung, die ich für dieses Plugin festlegen muss, um das Caching bei GET-Anforderungen zu deaktivieren?
\Drupal
an Orten zu verwenden, an denen Sie den Dienst einspeisen können. Dies sieht basierend auf Ihrem auskommentierten Code so aus, wie Sie es hier tun können.Ich hatte das gleiche Problem.
Nachdem ich die Dokumentation gelesen und diese Seite durchgesehen hatte, konnte ich den Cache für meinen benutzerdefinierten Endpunkt schließen. Hier ist ein Beispiel für meinen Arbeitscode in der Funktion get () für meinen Endpunkt:
Wenn Sie dies zum späteren Nachschlagen hinzufügen, hoffen Sie, dass dies jedem hilft, der es benötigt.
CacheableResponseTrait- Dokumentationsseite
quelle
drush cr
jedes Mal danach funktioniert.Ich hatte auch das gleiche Problem und die Lösung dafür ist:
Sie können auch die Dokumentationen CacheableMetadata und Cache-Kontexte anzeigen .
quelle