SISA MENDAPATKAN tanpa caching

11

Menggunakan tutorial ini drupal gprrperintah Konsol Drupal , saya telah membuat sumber daya REST khusus di Drupal 8. Saya dapat menggunakan sumber daya ini untuk mengambil objek JSON sederhana yang menyapa pengguna saat ini dengan melakukan GET pada:

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

JSON yang dikembalikan kemudian terlihat seperti ini:

{ "hello": "tyler" }

Ini diharapkan, saat saya masuk. Tetapi ketika saya keluar, dan melakukan GET lain pada sumber daya, hasil yang sama dikembalikan :

{ "hello": "tyler" }

Melakukan cache Drupal penuh menghapus masalah ini, tapi saya ingin secara khusus menonaktifkan caching pada sumber ini. Bagaimana saya bisa melakukan itu?

Sebagai solusinya, saya pikir menambahkan cap waktu ke string kueri akan berfungsi:

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

Tapi itu juga mengembalikan hasil yang sama persis , tidak peduli berapa nilai stempel waktu dalam string kueri.

Untuk singkatnya, inilah kode kerangka untuk membangun sumber daya 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()
    ));
  }

}

Apakah ada konfigurasi / pengaturan yang perlu saya atur di plugin ini untuk menonaktifkan caching pada permintaan GET?

tyler.frankenstein
sumber

Jawaban:

16

Anda ingin membaca dokumentasi Cacheability . ia mengatakan membuat array, tetapi juga berlaku untuk objek respons.

ResourceResponse mengimplementasikan CacheableResponseInterface, yang memiliki metode addCacheableDependency.

Jika dengan cara apa pun yang mungkin, Anda ingin menghindari menonaktifkan cache (yang akan Anda lakukan dengan mengatur cache max usia ke 0), tetapi tambahkan konteks cache yang diperlukan dan tag cache.

Dalam cache Anda, itu artinya semua yang perlu Anda lakukan adalah $ response-> addCacheableDependency ($ akun).

Anda juga tidak perlu getAccount (), cukup gunakan currentUser () secara langsung, ini adalah proxy.

Berdir
sumber
3
Anda juga harus menghindari penggunaan \Drupaldi tempat-tempat di mana Anda dapat menyuntikkan layanan, yang berdasarkan pada kode komentar Anda, sepertinya dapat Anda lakukan di sini.
mpdonadio
11

Saya memiliki masalah yang sama.

Setelah membaca dokumentasi dan melihat-lihat halaman ini, saya dapat mematikan cache untuk titik akhir kustom saya. Berikut adalah contoh kode kerja saya di dalam fungsi get () untuk titik akhir saya:

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

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

Menambahkan ini untuk referensi di masa mendatang, harap ini membantu siapa saja yang membutuhkannya.

Halaman dokumentasi CacheableResponseTrait

redbrickone
sumber
Tidak bekerja !!!!
podarok
@podarok - ini pada awalnya tidak berhasil untuk saya juga, kemudian setelah mengeluarkan satu lagi drush critu berfungsi setiap kali sesudahnya.
tyler.frankenstein
1
bekerja seperti pesona.
Mohamed Osama Gbril
5

Saya juga memiliki masalah yang sama dan solusi untuk itu adalah:

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

Anda juga dapat melihat dokumentasi CacheableMetadata dan konteks cache .

Iheb
sumber