Come posso impedire la memorizzazione nella cache di una determinata pagina?


14

Ho attivato la cache sul mio sito Drupal 8 e, naturalmente, tutte le pagine sono memorizzate nella cache come previsto.

Tuttavia, vorrei avere una pagina specifica ignorare quella cache.

Nel mio controller ho creato la pagina come segue:

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

Come posso dire a Drupal di non memorizzare nella cache la mia pagina?

Risposte:


31

Per Drupal 7:

Drupal ha la funzione drupal_page_is_cacheable () che può essere utilizzata per impostare una pagina su unsacheable.

Ecco la documentazione: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Per Drupal 8:

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

Quindi il codice è:

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

Come al solito, una volta fatto pulisci la cache .


19

Disabilita la cache per una pagina specifica

Disabilita la cache per una pagina personalizzata dalla dichiarazione del percorso. Se si desidera disabilitare la cache per un controller personalizzato (modulo personalizzato), è disponibile l' no_cacheopzione (YOUR_MODULE.routing.yml). Esempio: 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'

Aggiunta l'opzione di route 'no_cache' per contrassegnare le risposte di una route come non modificabili


11

In Drupal 8, puoi menzionare cache come max-age fino a quando desideri che la tua pagina in uscita venga memorizzata nella cache. Per rimuovere la cache di una determinata pagina (pagina Controller), scrivere 'max-age' => 0,.

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

2

Se devi fare qualcosa con un modulo contrib, puoi usare un RouteSubscriber per risolvere il problema della cache. hai bisogno di un servizio ... o semplicemente esegui drupal grse hai una console 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);
  }
 }
}

maggiori informazioni vedi https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.