Twig'i devre dışı bırakıp belirli bir modül için önbelleği nasıl engellerim?


15

Ben harici bir REST api zaman duyarlı veri alır Drupal 8 bir modül üzerinde çalışıyorum. Veriler işlenir ve bir Bloğa iletilir. Nihai veriler aşağıdaki gibi bir Twig şablonuna gönderilir:

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

Bu, önbelleğin etkin olduğu ve işlenen verilerin eski olarak gösterildiği üretim ortamında çalışmaz. Önbelleği yalnızca modülüm için nasıl devre dışı bırakabilirim ve bunu hem Twig şablonu hem de Block eklentisi için yapmam gerekir mi?

Yanıtlar:


27

Oluşturma dizisindeki önbelleği #cache öğesi ile kontrol edebilirsiniz.

Önbellek eklentisini devre dışı bırakmak için:

$build['#cache']['max-age'] = 0;

Bu durumda, oturum açmış kullanıcılar veya oturumu olan anonim kullanıcılar için blok önbelleğe alınmaz.

Oturumu olmayan anonim kullanıcılar için önbelleği devre dışı bırakmak istiyorsanız:

Page_cache modülünü tamamen kaldırarak veya kill anahtarını tetikleyerek devre dışı bırakın, bkz. Belirli bir sayfanın önbelleğe alınmasını nasıl önleyebilirim? Örneğin.

Dal kodunun önbelleğe alınması buna bağlı değildir, dal kodu önbelleği temizledikten sonra ilk kez kullanıldığında sadece bir kez önbelleğe alınır.

(Berdir yorumlarına göre düzenle)


Önbellek içeriğinin bu özel durumda yardımcı olmayacağını düşünüyorum, ancak 60 gibi önbelleğe almayı tamamen devre dışı bırakan 0 yerine gerçek bir maks. Yaş kullanmak istiyorsunuz. Verilerinizin ne kadar hassas olduğundan emin değilsiniz, ancak genellikle işler bir veya birkaç dakika önbelleğe alınabilir. Ayrıca, maksimum yaşın anonim sayfa önbelleğini etkilemediğini unutmayın. Anonim kullanıcılar için buna ihtiyacınız varsa, bunu tamamen devre dışı bırakmanız veya javascript kullanarak verileri getirmeniz gerekir.
Berdir

@Berdir: Anonim kullanıcılar için ancak oturumlarla max-age = 0 kullanıyorum. Bu şimdi dev. Bunun üretim için uygun olduğunu düşünüyor musunuz? Tamamen devre dışı bırakma ile ne demek istiyorsun?
4k4

Oturumlarınız varsa sorun değil, o zaman işe yarıyor. Page_cache modülünü tamamen kaldırarak veya kill anahtarını tetikleyerek devre dışı bırakın , örneğin drupal.stackexchange.com/questions/151254/… adresine bakın .
Berdir

Harika bilgi için teşekkür ederim, cevaba ekledim.
4k4

1
$ build ['# cache'] ['maks. yaş'] = 0; hile yaptı !!! Biralar her yerde! :)
Sorin

6

Belirli bir bloğu önbelleğe almayı durdurmak için aşağıdaki işlevi kullanın:

/**
 * Implements hook_preprocess_HOOK() for block.html.twig.
 */
function template-name_preprocess_block(&$vars) {
  if($vars['derivative_plugin_id'] == 'add-block-id-name') {
    //-- This stops the block being cache in drupal 8
    $vars['#cache']['max-age'] = 0;
  }
}

Mükemmel cevap.
Öğrenci

2

Belirli bir sayfa / içerik türü / denetleyicisi için önbelleği devre dışı bırak

Özel bir sayfanın önbelleğini rota bildiriminden devre dışı bırakın.

Özel bir denetleyici (Özel modül) için önbelleği devre dışı bırakmak istiyorsanız, no_cache(YOUR_MODULE.routing.yml) seçeneğiniz vardır. Örnek: Dosya: mymodule.routing.yml

mymodule.myroute:
  path: '/mymodule/mypage'
  defaults:
    _controller: '\Drupal\mymodule\Controller\Pages::mypage'
    _title: 'No cache page'
  requirements:
    _access: 'TRUE'
  options:
    no_cache: 'TRUE'

Bir rotanın yanıtlarını önbelleğe alınamaz olarak işaretlemek için 'no_cache' rota seçeneği eklendi


0

Belirli bir bloğun önbelleğe alınmasını önlemek için:

theme_name.theme dosyasına aşağıdaki kodu ekleyin

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}

0

Bir blok türü için önbelleği devre dışı bırakmak için, o tür bloğunu önceden işleyin ve max_age değerini 0 olarak ayarlayın.

   /**
     * Implements hook_preprocess_HOOK() for Block document templates.
     */
    function THEMENAME_preprocess_block(array &$variables) {

      //disbale cache from spotlight
      $content = $variables['elements']['content'];
      //dump($content); //check the contents
      if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {

        if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
          $variables['#cache']['max-age'] = 0;
        }

      }


    }
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.