Bagaimana cara menonaktifkan ranting dan memblokir cache untuk modul tertentu?

15

Saya sedang mengerjakan modul di Drupal 8 yang mengambil data sensitif waktu dari api REST eksternal. Data diproses dan diteruskan ke Blok. Data akhir dikirim ke templat Ranting seperti:

...

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

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

  return $build;
}

Ini tidak berfungsi pada lingkungan produksi tempat cache diaktifkan dan data yang diberikan muncul sebagai basi. Bagaimana cara menonaktifkan cache untuk modul saya saja, dan apakah saya harus melakukannya untuk templat Twig dan plugin Blokir?

estrar
sumber

Jawaban:

27

Anda dapat mengontrol cache dalam array render dengan elemen #cache.

Untuk menonaktifkan cache, tambahkan:

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

Dalam hal ini blok tidak akan di-cache untuk pengguna yang masuk atau pengguna anonim dengan sesi.

Jika Anda ingin menonaktifkan cache untuk pengguna anonim tanpa sesi:

Nonaktifkan baik dengan menghapus modul page_cache sepenuhnya atau dengan memicu sakelar kill, lihat Bagaimana cara mencegah halaman tertentu di-cache? sebagai contoh.

Caching kode ranting tidak terhubung dengan ini, kode ranting hanya di-cache sekali, pertama kali digunakan setelah Anda membersihkan cache.

(edit menurut komentar dari Berdir)

4k4
sumber
Saya kira konteks cache tidak akan membantu dalam kasus khusus ini, tetapi mungkin Anda ingin menggunakan usia maks yang sebenarnya alih-alih 0 yang menonaktifkan caching sepenuhnya, seperti 60. Tidak yakin seberapa sensitif waktu data Anda, tetapi biasanya, berbagai hal dapat di-cache selama satu atau beberapa menit. Perhatikan juga bahwa usia maks tidak mempengaruhi cache halaman anonim. Jika Anda memerlukan ini untuk pengguna anonim, Anda harus menonaktifkan itu sepenuhnya atau mengambil data menggunakan javascript.
Berdir
@Berdir: Saya menggunakan usia maks = 0 untuk pengguna anonim, tetapi dengan sesi. Ini bekerja sekarang di dev. Apakah Anda pikir ini OK untuk produksi? Apa maksud Anda dengan menonaktifkan sepenuhnya?
4k4
Tidak apa-apa jika Anda memiliki sesi, maka itu berfungsi. Nonaktifkan dengan menghapus modul page_cache sepenuhnya atau dengan memicu sakelar kill, lihat drupal.stackexchange.com/questions/151254/… misalnya.
Berdir
Terima kasih atas info hebatnya, saya telah menambahkan ini dalam jawabannya.
4k4
1
$ build ['# cache'] ['max-age'] = 0; lakukan triknya !!! Bir semua bulat! :)
Sorin
6

Untuk menghentikan caching blok tertentu, gunakan fungsi berikut:

/**
 * 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;
  }
}
gema
sumber
Jawaban yang sangat bagus.
Murid
2

Nonaktifkan cache untuk halaman / tipe konten / pengontrol tertentu

Nonaktifkan cache untuk halaman khusus dari deklarasi rute.

Jika Anda ingin menonaktifkan cache untuk pengontrol khusus (modul Kustom), Anda memiliki no_cacheopsi (YOUR_MODULE.routing.yml). Contoh: File: 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'

Menambahkan opsi rute 'no_cache' untuk menandai respons rute sebagai tidak dapat disimpan

Vladislav
sumber
0

Untuk mencegah caching blok tertentu:

tambahkan kode di bawah ini dalam file theme_name.theme

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

Untuk menonaktifkan cache untuk tipe blok, preproses blok jenis itu dan atur max_age ke 0.

   /**
     * 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;
        }

      }


    }
Wasim Khan
sumber