web-dev-qa-db-fra.com

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

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?

15
rpayanm

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é.

31
Zuzuesque

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 no_cache option (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'une route comme non mise en cache

19
Vladislav

Dans Drupal 8, vous pouvez mentionner le cache comme âge maximum jusqu'à ce 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.
  ];
} 
12
Ashish Deynap

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 gr if have drupal console.

 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 =

3
Taggart Jensen

Vous pouvez utiliser ce module pour éviter le 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.

1
VishnuMoorthy