Jak mogę zapobiec buforowaniu określonej strony?


15

Aktywowałem pamięć podręczną w mojej witrynie Drupal 8 i oczywiście wszystkie strony są buforowane zgodnie z oczekiwaniami.

Chciałbym jednak, aby ta strona pominęła tę pamięć podręczną.

W moim kontrolerze zbudowałem stronę w następujący sposób:

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

Jak mogę powiedzieć Drupalowi, aby nie buforował mojej strony?

Odpowiedzi:


31

W przypadku Drupal 7:

Drupal ma funkcję drupal_page_is_cacheable (), której można użyć do ustawienia strony na nieuleczalną.

Oto dokumentacja: https://api.drupal.org/api/drupal/includes!bootstrap.inc/function/drupal_page_is_cacheable/7

W przypadku Drupal 8:

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

Zatem kod to:

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

Jak zwykle wyczyść pamięć podręczną po zakończeniu .


19

Wyłącz pamięć podręczną dla określonej strony

Wyłącz pamięć podręczną niestandardowej strony z deklaracji trasy. Jeśli chcesz wyłączyć pamięć podręczną dla kontrolera niestandardowego (moduł niestandardowy), masz no_cacheopcję (YOUR_MODULE.routing.yml). Przykład: Plik: 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'

Dodano opcję trasy „no_cache”, aby oznaczyć odpowiedzi trasy jako nieusuwalne


12

W Drupal 8 możesz podać pamięć podręczną jako maksymalny wiek, dopóki nie chcesz, aby pamięć podręczna była buforowana. Aby usunąć pamięć podręczną określonej strony (strony kontrolera), napisz 'max-age' => 0,.

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

3

Jeśli potrzebujesz coś zrobić z modułem contrib, możesz użyć RouteSubscriber, aby naprawić problem z pamięcią podręczną. potrzebujesz usługi ... lub po prostu uruchom, drupal grjeśli masz konsolę 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);
  }
 }
}

więcej informacji patrz https://www.drupal.org/docs/8/api/routing-system/altering-existing-routes-and-adding-new-routes-based-on-dynamic-ones


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.