web-dev-qa-db-ja.com

RESTリソースでユーザーごとのキャッシュを処理する方法は?

RESTエンドポイントを介して特定のコンテンツタイプデータを公開する必要があります。以下が私のコードです。

public function get() {
    $current_user = $this->currentUser->id();
    $user = $this->entityTypeManager->getStorage('user')->load($current_user);
    $userLangId = $user->language()->getId();

    // You must to implement the logic of your REST Resource here.
    // Use current user after pass authentication to validate access.
    if (!$this->currentUser->hasPermission('access content')) {
      throw new AccessDeniedHttpException();
    }
    $news_values = [
      'langcode' => $userLangId,
      'type' => ['story'],
      'status' => 1,
    ];
    $news_data = $this->entityTypeManager->getStorage('node')->loadByProperties($news_values);
    $newsfeed = [];
    $newsfeed['stories'] = ['Story' => array_values($news_data)];
    if (empty($newsfeed)) {
      return new ResourceResponse('No Newsfeed exist for this user.', 400);
    }
    $response = new ResourceResponse($newsfeed, 200);
//    $response->addCacheableDependency($current_user);

    $response->addCacheableDependency(CacheableMetadata::createFromRenderArray([
      '#cache' => [
        'context' => ['user.roles'],
        'tags' => ['user:3', 'languages:' . $userLangId],
      ],
    ]));
    return $response;
  }

これで適切な応答を得ていますが、キャッシュの処理で問題が発生しています。このコンテンツはユーザー固有です。ユーザーの言語に基づいて、コンテンツにアクセスするとポップアップします。

応答ヘッダーでは、以下のものを得ています:

X-Drupal-Cache-Contexts: languages:language_interface theme url.site user.permissions
X-Drupal-Cache-Tags: config:filter.format.basic_html config:rest.resource.newsfeed_rest_resource config:rest.settings config:system.site http_response languages:fr node:7 node:9 user:3
X-Drupal-Dynamic-Cache: MISS/HIT

キャッシュタグではノードキーを追加していませんが、ノードが更新されると自動的に機能します。しかし、postmanクライアントでbasic authを介して別のユーザーでログインしようとすると、コンテンツがまったく変わりません。以前のユーザーのキャッシュされたコンテンツを示しています。ユーザーごとにコンテンツをキャッシュする方法。この点で私を助けてください。

1
Suraj

@Leighは正しく、userは存在します。キャッシュコンテキストは階層的で(変更レコード https://www.drupal.org/node/2451661 を参照)、userは最上位のコンテキストです。

だからこれはうまくいくはずです(contextsの複数形に注意してください):

  '#cache' => [
    'contexts' => ['user'],

IDEオートコンプリートでキャッシュコンテキストを追加することもできます:

$response->getCacheableMetadata()->addCacheContexts(['user']);
2
4k4