Comment empêcher la mise en cache d'une page particulière?

14

J'ai activé le cache sur mon site Drupal 8, et bien sûr toutes les pages sont mises en cache comme prévu.

Cependant, j'aimerais qu'une page spécifique contourne ce cache.

Dans mon contrôleur, j'ai construit la page comme suit:

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

Comment puis-je dire à Drupal de ne pas mettre en cache ma page?

rpayanm
la source

Réponses:

31

Pour Drupal 7:

Drupal a la fonction drupal_page_is_cacheable () qui peut être utilisée pour définir une page comme étant non mise en cache.

Voici la documentation: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Pour Drupal 8:

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

Alors le code est:

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

Comme d'habitude, nettoyez votre cache une fois terminé.

Zuzuesque
la source
19

Désactiver le cache pour une page spécifique

Désactivez le cache pour une page personnalisée à partir de la déclaration de route. Si vous souhaitez désactiver le cache pour un contrôleur personnalisé (module personnalisé), vous avez l' no_cacheoption (YOUR_MODULE.routing.yml). Exemple: Fichier: 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'

Ajout de l'option de route «no_cache» pour marquer les réponses d'un itinéraire comme non pouvant être mis en cache

Vladislav
la source
11

Dans Drupal 8, vous pouvez mentionner le cache comme âge maximum jusqu'à ce que vous souhaitiez que votre sortie de page soit mise en cache. Pour supprimer le cache d'une page particulière (page Controller), écrivez 'max-age' => 0,.

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

Si vous devez faire quelque chose avec un module contrib, vous pouvez utiliser un RouteSubscriber pour résoudre le problème de cache. vous avez besoin d'un service ... ou exécutez simplement drupal grsi vous avez une 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);
  }
 }
}

plus d'informations voir https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones

Taggart Jensen
la source
1

Vous pouvez utiliser ce module pour éviter le cache drupal et également le cache côté serveur comme le vernis https://www.drupal.org/project/ape

Cela fonctionne pour moi dans le cache Varnish sur le serveur acquia.

VishnuMoorthy
la source