无需缓存即可获取REST GET


11

使用本教程 Drupal Console的drupal gprr命令,我已经在Drupal 8中创建了一个自定义REST资源。我能够使用此资源来检索一个简单的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请求的缓存吗?

Answers:


16

您想阅读Cacheability文档。它表示渲染数组,但也适用于响应对象。

ResourceResponse实现CacheableResponseInterface,它具有addCacheableDependency方法。

如果有可能,您要避免禁用高速缓存(通过将高速缓存的最大使用期限设置为0可以做到),而是添加必要的高速缓存上下文和高速缓存标签。

在缓存中,这意味着您需要做的只是$ response-> addCacheableDependency($ account)。

您也不需要getAccount(),只需直接使用currentUser(),它是一个代理。


3
您还应避免\Drupal在可以注入服务的地方使用,这些地方基于注释掉的代码,看起来像您可以在此处进行。
mpdonadio

11

我遇到过同样的问题。

在阅读了文档并浏览了此页面之后,我能够为我的自定义端点关闭缓存。这是我的端点的get()函数中的工作代码示例:

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

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

添加此内容以供将来参考,希望这对需要它的人有所帮助。

CacheableResponseTrait文档页面


不起作用!!!
podarok

@podarok-最初对我来说这也不起作用,然后再发布一次后drush cr,每次都起作用。
tyler.frankenstein

1
像魅力一样运作。
Mohamed Osama Gbril '19

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.