ОТДЫХ ПОЛУЧИТЕ без кэширования


Использование этот учебник Команда консоли Drupal drupal gprr, я создал пользовательский ресурс REST в Drupal 8. Я могу использовать этот ресурс для извлечения простого объекта JSON, который передает привет текущему пользователю, выполнив команду GET on:

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

Возвращенный JSON выглядит следующим образом:

{ "hello": "tyler" }

Этого следовало ожидать, так как я вошел в систему. Но когда я выхожу из системы и делаю еще один заход на ресурс, тот же результат возвращенный:

{ "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?

 13
8
Author: tyler.frankenstein, 2015-12-03

3 answers

Вы хотите прочитать документацию по кэшированию . В ней говорится, что массивы визуализации, но это также относится к объектам ответа.

Resourceresponse реализует интерфейс cacheableresponse, который имеет метод addcacheabledependency.

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

В вашем кэше это означает, что все, что вам нужно сделать, это $ответ->addcacheabledependency ($учетная запись).

Вам также не нужен getAccount(), просто используйте CurrentUser() напрямую, это прокси-сервер.

 18
Author: Berdir, 2015-12-03 22:49:11

У меня была та же проблема.

Прочитав документацию и просмотрев эту страницу, я смог отключить кэш для своей пользовательской конечной точки. Вот пример моего рабочего кода внутри функции get() для моей конечной точки:

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

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

Добавляя это для дальнейшего использования, надеюсь, это поможет всем, кто в этом нуждается.

Cacheableresponsetrait страница документации

 13
Author: redbrickone, 2017-02-01 14:30:24

У меня тоже была такая же проблема, и решение для этого таково:

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

Вы также можете просмотреть документацию cacheablemetadata и контексты кэша.

 5
Author: Iheb, 2018-08-16 09:51:29