Bagaimana saya bisa mencegah halaman tertentu di-cache?


14

Saya telah mengaktifkan cache di situs Drupal 8 saya, dan tentu saja semua halaman di-cache seperti yang diharapkan.

Namun, saya ingin memiliki halaman tertentu memotong cache itu.

Di controller saya, saya membangun halaman sebagai berikut:

public function myPage() {
  return [
    '#markup' => time(),
  ];
}

Bagaimana saya bisa memberi tahu Drupal untuk tidak men-cache halaman saya?

Jawaban:


31

Untuk Drupal 7:

Drupal memiliki fungsi drupal_page_is_cacheable () yang dapat digunakan untuk mengatur halaman menjadi tidak bisa di-cache.

Ini dokumentasinya: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Untuk Drupal 8:

// Deny any page caching on the current request.    
\Drupal::service('page_cache_kill_switch')->trigger();

Maka kodenya adalah:

public function myPage() {
  \Drupal::service('page_cache_kill_switch')->trigger();
  return [
    '#markup' => time(),
  ];
}

Seperti biasa, bersihkan cache Anda setelah selesai.


19

Nonaktifkan cache untuk halaman 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


11

Di Drupal 8, Anda dapat menyebutkan cache sebagai usia maks hingga Anda ingin halaman Anda di-cache. Untuk menghapus cache dari halaman tertentu (halaman Controller), tulis 'max-age' => 0,.

public function myPage() {
  return [
   '#markup' => time(),
   '#cache' => ['max-age' => 0,],    //Set cache for 0 seconds.
  ];
} 

2

Jika Anda perlu melakukan sesuatu dengan modul contrib, Anda dapat menggunakan RouteSubscriber untuk memperbaiki masalah cache. Anda memerlukan layanan ... atau jalankan drupal grjika memiliki konsol drupal.

 namespace Drupal\mymodule\Routing;

 use Drupal\Core\Routing\RouteSubscriberBase;
 use Symfony\Component\Routing\RouteCollection;

 class RouteSubscriber extends RouteSubscriberBase {

/**
 * {@inheritdoc}
 */
protected function alterRoutes(RouteCollection $collection) {
  // Find the route you need ...
  if ($route = $collection->get('some.contrib.route')) {
    $options = $route->getOptions();
    $options['no_cache'] = TRUE;
    $route->setOptions($options);
  }
 }
}

info lebih lanjut lihat https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.