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
を介して別のユーザーでログインしようとすると、コンテンツがまったく変わりません。以前のユーザーのキャッシュされたコンテンツを示しています。ユーザーごとにコンテンツをキャッシュする方法。この点で私を助けてください。
@Leighは正しく、user
は存在します。キャッシュコンテキストは階層的で(変更レコード https://www.drupal.org/node/2451661 を参照)、user
は最上位のコンテキストです。
だからこれはうまくいくはずです(contexts
の複数形に注意してください):
'#cache' => [
'contexts' => ['user'],
IDEオートコンプリートでキャッシュコンテキストを追加することもできます:
$response->getCacheableMetadata()->addCacheContexts(['user']);