Özel Önbellek Etiketlerini Uygulama


14

Farklı türlerdeki (varlıklar, düğümler, bloklar, vb.) İlgili içeriği senkronize halde tutmak için D8'deki yeni Önbellek Etiketleme'yi kullanmak istiyorum. Ancak bu özelliğin şu anda mevcut olan belgelerini okuyarak, söz konusu öğeleri oluştururken / güncellerken içerik öğelerine kendi önbellek etiketimi nasıl ekleyeceğimi anlamıyorum.

Örneğin, Store türünde yeni bir düğüm oluştururken önbellek etiketi konumunu eklemek istiyorum: new_york_123 ve aynı aa bloğu için. Sonra New York 123 konumunun görünen adını SoHo olarak değiştirirsem, önbellek etiketini geçersiz kılabilir ve ilgili tüm içerik güncellemesine sahip olabilirim.


1
Tüm varlıkların zaten otomatik olarak geçersiz kılınan bir önbellek etiketi (örn. Düğüm: 123) vardır. Bu nedenle, sadece düğümler oluşturuyor / güncelliyorsanız ve görüntülüyorsanız, hiçbir şey yapmanıza gerek yoktur, sadece çalışmalıdır.
Berdir

oluştur / güncellemeyle ilgili tüm içerik türlerini (düğümler, bloklar, varlıklar) bulmak ve daha sonra bunları her önbellek tablosundan temizlemek için bir sorgu gerektirir. İçerik öğelerinin ilişkisini tanımlamak için tek bir özel önbellek etiketi kullanılırsa, ilgili öğelerin önbelleğini temizlemek için yalnızca bu etiketin geçersiz kılınması gerekir.
LittleCoding

Ne demek istediğini ve yapının ne olduğunu anlamıyorum. Etiketler kullanıldıklarında eklenir. Önbellek etiketleri, düğüm / şey değiştirilirse değiştirilmesi gerekiyorsa, blok gibi herhangi bir oluşturma öğesine eklenmelidir. Varlıkları görüntülemek için standart mekanizmalar kullanırsanız, muhtemelen durum böyledir. Eğer işe yaramazsa, tam olarak ne yaptığınızı kodla daha ayrıntılı olarak paylaşmanız gerekir.
Berdir

önbellek etiketi kullanıcısı: {ID}, o kullanıcıyla ilgili tüm içerik için önbelleği temizlemeyi tetiklemek üzere geçersiz kılınabilir. Aynı fikir, ancak özel önbellek etiketi ile.
LittleCoding

Yanıtlar:


13

İşte ben denedim ve çalışır özel bloklar bağlamında önbellek etiketleri nasıl kullanılır ama diğer bağlamlar için geçerli olduğunu düşünüyorum

Varsayılan drupal etiketlerini kullan

Yapı dizisinde belirtebilirsiniz cache > tags > node_listve HERHANGİ BİR NODE sizin tarafınızdan yapılacak başka bir şeyle değiştirilmediğinde bu blok içeriği geçersiz hale gelir (yenilenir)

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
        ],
    );
}

Alternatif olarak, yukarıdaki kod açıklamasında gösterildiği gibi diziyi belirli düğümler veya terimler üzerinde geçersiz kılmak için bir veya daha fazla düğüm / terim / kullanıcı kimliği koyabilirsiniz. Not: Düğümleri, terimleri, kullanıcıları ve özel etiketleri uygun gördüğünüz şekilde karıştırabilir ve eşleştirebilirsiniz.

Kendi etiketlerinizi kullanın

derleme dizinizi temizlemenin kendi yoluna sahip olmak istiyorsanız, özel benzersiz etiketinizi derleme dizisine ekleyin (herhangi bir benzersiz dize yapar)

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

ve invalidateTagskendi kodunuzla özel kod mantık çağrınızda

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

drupal 8 önbellek dahili bilgileri hakkında daha fazla bilgi edinmek istiyorsanız


2
İdeal olarak, cache_tags.invalidatorbir sınıfa doğrudan başvurmak yerine hizmeti kullanacağınızı düşünüyorum .
Andy
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.