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?

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


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


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.
  ];
} 

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


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.