REST GET bez buforowania

11

Korzystając z tego samouczka polecenia Drupal Console drupal gprr, utworzyłem niestandardowy zasób REST w Drupal 8. Jestem w stanie użyć tego zasobu, aby pobrać prosty obiekt JSON, który przywitał się z bieżącym użytkownikiem, wykonując GET na:

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

Zwrócony JSON wygląda następująco:

{ "hello": "tyler" }

Tego należy się spodziewać, ponieważ jestem zalogowany. Ale kiedy się wyloguję i ponownie wykonam GET na zasobie, ten sam wynik zostanie zwrócony :

{ "hello": "tyler" }

Wykonanie pełnego wyczyszczenia pamięci podręcznej Drupala rozwiązuje ten problem, ale chciałbym specjalnie wyłączyć buforowanie tego zasobu. Jak mogę to zrobić?

Jako obejście, pomyślałem, że dodanie znacznika czasu do ciągu zapytania zadziała:

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

Ale to również zwraca dokładnie ten sam wynik , bez względu na wartość znacznika czasu w ciągu zapytania.

Dla zwięzłości, oto szkielet kodu do budowy zasobu 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()
    ));
  }

}

Czy w tej wtyczce muszę ustawić konfigurację / ustawienie, aby wyłączyć buforowanie żądań GET?

tyler.frankenstein
źródło

Odpowiedzi:

16

Chcesz przeczytać dokumentację dotyczącą pamięci podręcznej . mówi tablice renderowania, ale dotyczy to także obiektów odpowiedzi.

ResourceResponse implementuje CacheableResponseInterface, który ma metodę addCacheableDependency.

Jeśli w jakikolwiek sposób jest to możliwe, chcesz uniknąć wyłączenia pamięci podręcznej (co można zrobić, ustawiając maksymalny wiek pamięci podręcznej na 0), ale dodaj niezbędne konteksty pamięci podręcznej i znaczniki pamięci podręcznej.

W twojej pamięci podręcznej oznacza to, że wszystko, co musisz zrobić, to $ response-> addCacheableDependency ($ konto).

Nie potrzebujesz również getAccount (), po prostu użyj currentUser () bezpośrednio, to proxy.

Berdir
źródło
3
Powinieneś także unikać korzystania \Drupalw miejscach, w których możesz wstrzyknąć usługę, która wygląda na to, że na podstawie skomentowanego kodu możesz to zrobić.
mpdonadio
11

Miałem ten sam problem.

Po przeczytaniu dokumentacji i przejrzeniu tej strony udało mi się wyłączyć pamięć podręczną dla mojego niestandardowego punktu końcowego. Oto przykład mojego działającego kodu wewnątrz funkcji get () dla mojego punktu końcowego:

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

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

Dodając to do wykorzystania w przyszłości, mam nadzieję, że pomoże to każdemu, kto tego potrzebuje.

Strona dokumentacji CacheableResponseTrait

redbrickone
źródło
Nie działa !!!!
podarok
@podarok - dla mnie to też początkowo nie działało, potem po wydaniu jeszcze jednego drush crdziałało za każdym razem.
tyler.frankenstein
1
działał jak urok.
Mohamed Osama Gbril