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