Di mana saya menambahkan konteks cache baru untuk suatu entitas?


9

Saya belum bisa menambahkan konteks cache untuk bekerja untuk entitas di drupal 8. Secara khusus saya akan mencari header: User-Agent. Saya mencoba banyak variasi pada modul berikut.

 use Drupal\node\NodeInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\Display\EntityViewDisplayInterface;

 function hook_entity_view_alter(&$build, EntityInterface $entity, EntityViewDisplayInterface $display){
   if($entity->getType() == 'relevant_type'){
    $build['#cache']['contexts'][] = 'headers:User-Agent';
   }

 }

Saya mencoba untuk mendapatkan akses node untuk diperiksa ketika konteks itu berubah. Saya juga sudah mencobanya di hook_entity_build_defaults_alter()fungsi.


Perhatikan bahwa konteks cache tidak mempengaruhi akses simpul yang dimiliki pengguna. Konteks cache hanya untuk berubah ketika data di-cache.
kiamlaluno

Akses node yang diatur dalam hook_node_access di-cache.
ummdorian

Itu adalah tempat cache yang berbeda, bukan yang digunakan untuk konten.
kiamlaluno

Lihat kelas yang mengimplementasikan \ Drupal \ Core \ Cache \ Context \ CacheContextInterface

Jawaban:


6

Anda memang harus menggunakannya hook_entity_build_defaults_alter(). Dokumentasinya bahkan secara eksplisit menyatakan ini:

Ubah nilai entitas yang dapat diurai sebelum pemeriksaan cache di drupal_render ().

Nilai-nilai dalam #cachekunci array yang dapat diurai digunakan untuk menentukan apakah ada entri cache untuk output yang diberikan entitas. Idealnya hanya nilai-nilai yang berkaitan dengan caching yang harus diubah dalam hook ini.

Ini mungkin tidak bekerja untuk Anda karena Anda lupa untuk menghapus cache render setelah menerapkan hook itu.

Pengait itu dipanggil di https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21EntityViewBuilder.php/class/EntityViewBuilder/8

Juga lihat https://www.drupal.org/developing/api/8/cache/contexts untuk ikhtisar konteks cache (apa itu, bagaimana menggunakannya, yang mana inti dikirim bersama).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.