ВІДНОВИТИ ЗАРАЗ, без кешування


11

Використовуючи цей підручник Drupal консоль drupal gprrкоманди, я створив ресурс користувальницької REST в Drupal 8. Я можу використовувати цей ресурс , щоб отримати простий об'єкт JSON , який говорить привіт до активного користувача, роблячи GET на:

http://localhost/example/hello?_format=json

Потім повернувся JSON виглядає приблизно так:

{ "hello": "tyler" }

Цього слід очікувати, коли я входив у систему. Але коли я виходжу та виконую інший GET на ресурсі, той самий результат повертається :

{ "hello": "tyler" }

Виконання повного кеша Drupal чітко виправляє цю проблему, але я хотів би спеціально відключити кешування на цьому ресурсі. Як я можу це зробити?

Як вирішення, я думав, що додавання позначки часу до рядка запиту спрацює:

http://localhost/example/hello?_format=json&time=123456789

Але це також повертає точно такий же результат , незалежно від того, яке значення часової позначки знаходиться в рядку запиту.

Для стислості, ось код скелета для створення ресурсу GET:

class ExampleHello extends ResourceBase {

  /**
   * {@inheritdoc}
   */
  public static function create(/* ... */) {
    return new static(/* ... */);
  }

  /**
   * Constructs a Drupal\rest\Plugin\ResourceBase object.
   */
  public function __construct(/* ... */) {
    parent::__construct(/* ... */);
    // ...
  }

  /*
   * Responds to GET requests.
   */
  public function get() {

    $account = \Drupal::currentUser()->getAccount();
    if (!$account->id()) {
      return new ResourceResponse(array(
        'welcome' => 'visitor'
      ));
    }
    return new ResourceResponse(array(
      'hello' => $account->getAccountName()
    ));
  }

}

Чи потрібно налаштувати / налаштувати цей плагін, щоб відключити кешування на GET-запитах?

Відповіді:


16

Ви хочете прочитати документацію на кешування . він говорить масиви візуалізації, але він також застосовується до об'єктів відповіді.

ResourceResponse реалізує CacheableResponseInterface, який має метод addCacheableDependency.

Якщо будь-яким чином можливо, ви хочете уникнути відключення кешу (що ви зробите, встановивши максимальний вік кешу на 0), але додайте необхідні контексти кешу та теги кешу.

У вашому кеші це означає, що вам потрібно лише $ response-> addCacheableDependency ($ рахунок).

Вам також не потрібно getAccount (), просто використовуйте currentUser () безпосередньо, це проксі.


3
Ви також повинні уникати використання \Drupalв місцях, де ви можете ввести послугу, яка, виходячи з коментованого коду, виглядає так, як ви можете тут.
mpdonadio

11

У мене було те саме питання.

Прочитавши документацію та переглянувши цю сторінку, я зміг вимкнути кеш-пам'ять для власної власної кінцевої точки. Ось приклад мого робочого коду всередині функції get () для моєї кінцевої точки:

$build = array(
  '#cache' => array(
    'max-age' => 0,
  ),
);

return (new ResourceResponse($myResponse))->addCacheableDependency($build);

Додаючи це для подальшого ознайомлення, сподіваємось, що це допоможе тому, хто цього потребує.

Сторінка документації CacheableResponseTrait


Не працює !!!!
подарок

@podarok - спочатку це не працювало і для мене, потім після випуску ще одного drush crпрацювало щоразу згодом.
tyler.frankenstein

1
працював як шарм.
Мохамед Осама Гбриль

5

У мене також було те саме питання, і рішення для цього є:

$response->getCacheableMetadata()->addCacheContexts(['url.query_args', 'url.path']);

Ви також можете побачити документації CacheableMetadata та кеш-контексти .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.