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?

rpayanm
sumber

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.

Zuzuesque
sumber
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

Vladislav
sumber
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.
  ];
} 
Ashish Deynap
sumber
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

Taggart Jensen
sumber
1

Anda dapat menggunakan modul ini untuk menghindari cache drupal dan juga cache sisi server seperti varnish https://www.drupal.org/project/ape

Ini berfungsi untuk saya di Varnish cache pada server acquia.

WisnuMoorthy
sumber