Belirli bir sayfanın önbelleğe alınmasını nasıl önleyebilirim?


15

Drupal 8 sitemdeki önbelleği etkinleştirdim ve elbette tüm sayfalar beklendiği gibi önbelleğe alındı.

Ancak, bu önbelleği atlamak için belirli bir sayfa istiyorum.

Denetleyicimde sayfayı şu şekilde oluşturdum:

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

Drupal'a sayfamı önbelleğe almamasını nasıl söyleyebilirim?

Yanıtlar:


31

Drupal 7 için:

Drupal, bir sayfayı önbelleğe alınamaz olarak ayarlamak için kullanılabilen drupal_page_is_cacheable () işlevine sahiptir.

İşte belgeler: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Drupal 8 için:

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

Sonra kod:

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

Her zamanki gibi, önbelleğinizi bir kez tamamlayın.


19

Belirli bir sayfa 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


12

Drupal 8'de, sayfa çıkışınızın önbelleğe alınmasını istediğinize kadar önbellekten maksimum yaş olarak bahsedebilirsiniz. Belirli bir sayfanın önbelleğini kaldırmak için (Denetleyici sayfası) yazın 'max-age' => 0,.

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

3

Katkı modülü ile bir şeyler yapmanız gerekiyorsa, önbellek sorununu gidermek için bir RouteSubscriber kullanabilirsiniz. bir servise ihtiyacınız var ... ya da sadece drupal grdrupal konsolunuz varsa çalıştırın .

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

daha fazla bilgi için bkz. https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


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.