Bagaimana cara menghapus cache wildcard di Drupal 8?

8

Di Drupal 7, kami dulu bisa melakukan ini:

cache_clear_all('state:', 'cache', TRUE)

yang akan menghapus setiap cache nampan yang dimulai dengan string state:(pencocokan ID cache seperti state:infodan state:nebraska).

Catatan perubahan di https://www.drupal.org/node/1272696 bahkan mencatat use case ini dalam contoh Drupal 7, tetapi tidak benar-benar memberikan contoh bagaimana mereplikasi di D8.

Tampaknya kita seharusnya menggunakan tag cache, yang sepertinya konversi yang lebih mahal mengingat kasus penggunaan yang sederhana. Saya tidak melihat metode pencocokan yang akan berlaku di CacheBackendInterface . Catatan, ini bukan tentang menghapus semua item dalam nampan cache, yang jelas dicakup oleh deleteAll ().

Dave Reid
sumber

Jawaban:

8

Tidak yakin mengapa jawaban yang ada dihapus, itu (hampir) benar.

Cache wildcard dihapus telah dihapus. Sangat rumit untuk mendukung backend seperti redis dan memcache, yang tidak memiliki dukungan wildcard.

Tag cache adalah penggantinya dan tidak terlalu rumit untuk digunakan. Anda cukup memberikan daftar string sebagai argumen ke-4 (agak menjengkelkan karena Anda harus mengatur argumen cap waktu default, metode yang terpisah akan menyenangkan):

\Drupal::cache('default')->set('state:info', $your_data, Cache::PERMANENT, 
['state']);

lalu panggil:

\Drupal\Core\Cache\Cache::invalidateTags(array('state'));
Berdir
sumber
Oke, saya akan membantu memperbarui pemberitahuan perubahan agar lebih eksplisit bahwa tag cache harus digunakan sebagai pengganti.
Dave Reid
Apa cara yang dapat diandalkan untuk mendapatkan semua kunci cache yang perlu ditandai untuk dihapus? Misalnya jika saya ingin menghapus 'entity_bundle_extra_fields:node:article:' . $langcodesemua bahasa? Saya bisa mendapatkan daftar semua bahasa, tetapi apakah ada sesuatu yang lebih sederhana? Dalam hal ini sudah memiliki tag cache, 'entitas_field_info'. Tapi mungkin saya ingin membatalkan kurang luas.
donquixote
Tidak, tidak ada. API cache tidak memiliki metode kueri / daftar. Dan Anda tidak boleh berinteraksi secara langsung dengan entri cache orang lain, gunakan API, misalnya manajer bidang entitas, hapus definisi cache dalam kasus ini. Entri cache itu bukan API, inti bebas untuk mengubah kunci / struktur dan kemudian kode Anda akan rusak
Berdir