¿Cómo puedo evitar que una página en particular se almacene en caché?


14

He activado el caché en mi sitio Drupal 8 y, por supuesto, todas las páginas se almacenan en caché como se esperaba.

Sin embargo, me gustaría que una página específica omita ese caché.

En mi controlador construí la página de la siguiente manera:

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

¿Cómo puedo decirle a Drupal que no almacene en caché mi página?

Respuestas:


31

Para Drupal 7:

Drupal tiene la función drupal_page_is_cacheable () que se puede usar para configurar una página como no almacenable en caché.

Aquí está la documentación: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

Para Drupal 8:

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

Entonces el código es:

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

Como de costumbre, limpia tu caché una vez hecho.


19

Deshabilitar caché para una página específica

Deshabilite el caché para una página personalizada desde la declaración de ruta. Si desea deshabilitar la memoria caché para un controlador personalizado (módulo personalizado), tiene la no_cacheopción (YOUR_MODULE.routing.yml). Ejemplo: Archivo: 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'

Se agregó la opción de ruta 'no_cache' para marcar las respuestas de una ruta como no almacenables en caché


11

En Drupal 8, puede mencionar el caché como edad máxima hasta que desee que la salida de su página se almacene en caché. Para eliminar el caché de una página en particular (página Controlador), escriba 'max-age' => 0,.

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

2

Si necesita hacer algo con un módulo contrib puede usar un RouteSubscriber para solucionar el problema de caché. necesitas un servicio ... o simplemente ejecutarlo drupal grsi tienes consola 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);
  }
 }
}

Para obtener más información, consulte https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.