キャッシュなしのREST GET


11

使用して、このチュートリアルのDrupalコンソールのdrupal gprrコマンドを、私は私が上でGETを実行して、現在のユーザーに挨拶を言うシンプルなJSONオブジェクトを取得するには、このリソースを使用することができるよDrupalの8のカスタムRESTリソースを作成しました:

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は、addCacheableDependencyメソッドを持つCacheableResponseInterfaceを実装します。

可能であれば、キャッシュを無効にすることは避けたいですが(キャッシュの最大経過時間を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た。それから、もう1つ発行した後、毎回うまくいきました。
tyler.frankenstein

1
魅力のように働いた。
Mohamed Osama Gbril

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.