Menerapkan Tag Cache Kustom

14

Saya ingin menggunakan Penandaan Cache baru di D8 untuk membantu menjaga konten terkait dari berbagai jenis (entitas, node, blok, dll) dalam sinkronisasi. Tetapi dari membaca dokumentasi fitur ini yang saat ini tersedia, saya tidak mengerti bagaimana cara menambahkan tag cache saya sendiri ke item konten ketika membuat / memperbarui item tersebut.

Misalnya ketika membuat simpul baru dari tipe Store saya ingin menambahkan lokasi tag cache: new_york_123 dan sama untuk blok aa. Kemudian jika saya mengubah nama tampilan lokasi New York 123 menjadi SoHo, saya dapat membatalkan tag cache dan memiliki semua pembaruan konten terkait.

LittleCoding
sumber
1
Semua entitas sudah memiliki tag cache (mis. Simpul: 123) yang secara otomatis tidak valid. Jadi jika Anda hanya membuat / memperbarui dan menampilkan node, Anda tidak harus melakukan apa pun, itu hanya akan berfungsi.
Berdir
saat membuat / memperbarui itu akan memerlukan permintaan untuk menemukan semua jenis konten terkait (node, blok, entitas) dan kemudian menghapusnya dari setiap tabel cache. Jika satu tag cache kustom digunakan untuk mengidentifikasi hubungan dari item konten hanya tag yang perlu divalidasi untuk menghapus cache dari item-item terkait.
LittleCoding
Saya tidak mengerti apa yang Anda maksud dan apa struktur Anda. Tag ditambahkan saat digunakan. Tag cache harus ditambahkan ke elemen render apa pun seperti blok jika perlu diubah jika simpul / benda itu diubah. Jika Anda menggunakan mekanisme standar untuk menampilkan entitas, maka kemungkinan itu sudah terjadi. Jika tidak berhasil, Anda perlu berbagi lebih detail, dengan kode, apa yang sebenarnya Anda lakukan.
Berdir
pengguna tag cache: {ID} dapat tidak valid untuk memicu cache menghapus semua konten yang terkait dengan pengguna itu. Gagasan yang sama, tetapi dengan tag cache khusus.
LittleCoding

Jawaban:

13

Berikut adalah cara menggunakan tag cache dalam konteks blok khusus yang telah saya coba dan berfungsi tetapi saya pikir ini berlaku untuk konteks lain

Gunakan tag drupal default

Di dalam susunan bentukan, Anda dapat menentukan cache > tags > node_listdan mencekal konten ini akan menjadi tidak valid (di-refresh) ketika APA PUN DOMPET berubah tanpa melakukan apa pun di pihak Anda

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['node_list'], //invalidate when any node updates
            //'tags' => ['node:1','term:2'], //invalidate when node 1 or term 2 updates
        ],
    );
}

Atau Anda dapat memasukkan satu atau lebih node / term / ID pengguna untuk membatalkan array pada node atau istilah tertentu seperti yang ditunjukkan dalam komentar kode di atas. Catatan: Anda dapat mencampur dan mencocokkan node, istilah, pengguna, dan tag khusus sesuai keinginan Anda.

Gunakan tag Anda sendiri

jika Anda ingin memiliki cara sendiri untuk menghapus array build Anda, tambahkan tag unik khusus Anda di array build (string unik apa pun akan dilakukan)

public function build() {
    return array(
        '#markup' => MY_MODULE_awesome_dynamic_node_content(),
        '#cache' => [
            'tags' => ['MY_CUSTOM_UNIQUE_TAG'],
        ],
    );
}

dan dalam panggilan logika kode khusus invalidateTagsAnda dengan tag Anda sendiri

function MY_MODULE_custom_clear_cache_logic(){ 
    ...
    \Drupal\Core\Cache\Cache::invalidateTags(array('MY_CUSTOM_UNIQUE_TAG'));        

jika Anda ingin membaca lebih lanjut tentang internal 8 cache drupal

GiorgosK
sumber
2
Saya pikir idealnya Anda akan menggunakan cache_tags.invalidatorlayanan daripada merujuk kelas secara langsung.
Andy