Önbelleğe almadan REST GET


11

Bu öğretici Drupal Konsolu'nun drupal gprrkomutunu kullanarak , Drupal 8'de özel bir REST kaynağı oluşturdum. Bu kaynağı, bir GET yaparak geçerli kullanıcıya merhaba diyen basit bir JSON nesnesi almak için kullanabiliyorum:

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

Geri dönen JSON şöyle görünür:

{ "hello": "tyler" }

Bu, beklediğim gibi giriş yaptım. Ama ben çıkış ve kaynak başka bir GET yaptığımda, aynı sonuç döndürülür :

{ "hello": "tyler" }

Tam bir Drupal önbellek temizlemesi yapmak bu sorunu giderir, ancak bu kaynakta önbelleğe almayı özellikle devre dışı bırakmak istiyorum. Bunu nasıl yapabilirim?

Geçici bir çözüm olarak, sorgu dizesine bir zaman damgası eklemek işe yarayacağını düşündüm:

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

Ancak sorgu dizesinde hangi zaman damgası değeri olursa olsun, aynı sonucu döndürür .

Kısacası, GET kaynağını oluşturmak için iskelet kodu şöyledir:

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

}

GET isteklerinde önbelleğe almayı devre dışı bırakmak için bu eklentide ayarlamam gereken bir yapılandırma / ayar var mı?

Yanıtlar:


16

Önbelleklenebilirlik belgelerini okumak istiyorsunuz . dizileri oluşturma diyor, ancak yanıt nesneleri için de geçerli.

ResourceResponse, addCacheableDependency yöntemine sahip CacheableResponseInterface uygular.

Mümkünse, önbelleği devre dışı bırakmaktan kaçınmak istersiniz (önbellek maks yaşını 0 olarak ayarlayarak yaparsınız), ancak gerekli önbellek bağlamlarını ve önbellek etiketlerini ekleyin.

Önbelleğinizde, tek yapmanız gereken $ response-> addCacheableDependency ($ account).

Ayrıca getAccount () 'a ihtiyacınız yoktur, sadece currentUser () kullanın, bu bir proxy.


3
Açıklamalı \Drupalkodunuza dayanarak burada yapabileceğiniz gibi görünen hizmeti enjekte edebileceğiniz yerlerde de kullanmaktan kaçınmalısınız .
mpdonadio

11

Aynı sorunu yaşadım.

Belgeleri okuduktan ve bu sayfaya baktıktan sonra, özel uç noktamın önbelleğini kapatabildim. İşte benim uç nokta için get () işlevi içinde çalışma koduma bir örnek:

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

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

Bunu ileride başvurmak üzere ekleyerek, bunun ihtiyacı olan herkese yardımcı olacağını umuyoruz.

CacheableResponseTrait belge sayfası


Çalışmıyor !!!!
podarok

@podarok - bu da benim için ilk başta işe yaramadı, sonra bir tane daha yayınladıktan sonra drush crher seferinde işe yaradı.
tyler.frankenstein

1
bir cazibe gibi çalıştı.
Mohamed Osama Gbril

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.