RESTO OTTIENI senza memorizzazione nella cache


11

Utilizzando questo tutorial del drupal gprrcomando Drupal Console , ho creato una risorsa REST personalizzata in Drupal 8. Sono in grado di utilizzare questa risorsa per recuperare un semplice oggetto JSON che saluta l'utente corrente facendo un GET su:

http://localhost/example/hello?_format=json

Il JSON restituito è quindi simile al seguente:

{ "hello": "tyler" }

Questo è prevedibile, poiché ho effettuato l'accesso. Ma quando eseguo il logout e eseguo un altro GET sulla risorsa, viene restituito lo stesso risultato :

{ "hello": "tyler" }

Fare una cache Drupal completa risolve questo problema, ma mi piacerebbe disabilitare specificamente la memorizzazione nella cache su questa risorsa. Come posso fare ciò?

Per ovviare al problema, ho pensato che l'aggiunta di un timestamp alla stringa di query avrebbe funzionato:

http://localhost/example/hello?_format=json&time=123456789

Ma questo restituisce anche lo stesso esatto risultato , indipendentemente dal valore del timestamp nella stringa della query.

Per brevità, ecco il codice scheletro per la creazione della risorsa GET:

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()
    ));
  }

}

C'è una configurazione / impostazione che devo impostare su questo plugin per disabilitare la memorizzazione nella cache delle richieste GET?

Risposte:


16

Vuoi leggere la documentazione sulla cache . dice array di rendering, ma si applica anche agli oggetti risposta.

ResourceResponse implementa CacheableResponseInterface, che ha il metodo addCacheableDependency.

Se possibile, si desidera evitare di disabilitare la cache (cosa che si farebbe impostando la durata massima della cache su 0), ma aggiungere i contesti e i tag cache necessari.

Nella tua cache, ciò significa che tutto ciò che devi fare è $ response-> addCacheableDependency ($ account).

Inoltre non è necessario getAccount (), basta usare currentUser () direttamente, è un proxy.


3
Dovresti anche evitare l'uso \Drupalin luoghi in cui puoi iniettare il servizio, che in base al tuo codice commentato, sembra che puoi fare qui.
mpdonadio

11

Ho avuto lo stesso problema.

Dopo aver letto la documentazione e aver consultato questa pagina, sono stato in grado di chiudere la cache per il mio endpoint personalizzato. Ecco un esempio del mio codice di lavoro all'interno della funzione get () per il mio endpoint:

$build = array(
  '#cache' => array(
    'max-age' => 0,
  ),
);

return (new ResourceResponse($myResponse))->addCacheableDependency($build);

Aggiungendo questo come riferimento futuro, spero che questo aiuti chiunque ne abbia bisogno.

Pagina della documentazione di CacheableResponseTrait


Non funziona !!!!
Podarok,

@podarok: neanche questo ha funzionato all'inizio per me, poi dopo averne emesso un altro drush crha funzionato ogni volta in seguito.
tyler.frankenstein,

1
ha funzionato come un fascino.
Mohamed Osama Gbril,

5

Ho anche avuto lo stesso problema e la soluzione è:

$response->getCacheableMetadata()->addCacheContexts(['url.query_args', 'url.path']);

Puoi anche vedere la documentazione di CacheableMetadata e i contesti di cache .

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.