クライアントとして角度8のヘッドレスモードでDrupal 8を使用しています。私が直面している問題は、DrupalがAPIへの呼び出しをキャッシュすることです。たとえば、ランダムな順序でアイテムを提供することを想定しているエンドポイントがありますが、これは発生せず、特定の順序でのみキャッシュアイテムを取得します。どうすればこれを克服できますか?キャッシュモジュールを無効にしようとしましたが、それでも同じ動作が得られます
クライアントとして角度8のヘッドレスモードでDrupal 8を使用しています。私が直面している問題は、DrupalがAPIへの呼び出しをキャッシュすることです。たとえば、ランダムな順序でアイテムを提供することを想定しているエンドポイントがありますが、これは発生せず、特定の順序でのみキャッシュアイテムを取得します。どうすればこれを克服できますか?キャッシュモジュールを無効にしようとしましたが、それでも同じ動作が得られます
回答:
Drupalには2つのレベルのキャッシングがあります。
1.)動的ページキャッシュ
jsonレスポンスに正しいキャッシュメタデータを提供する必要があります。
たとえば、構成またはコンテンツエンティティのキャッシュプロパティを使用する
$response->addCacheableDependency($entitiy);
または、キャッシュ可能なメタデータオブジェクトを作成し、これを応答に追加します。
$build = [
'#cache' => [
'contexts' => ['url.query_args'],
'tags' => ['node:1', 'node_list'],
'max-age' => 300,
],
];
$cache_metadata = \Drupal\Core\Cache\CacheableMetadata::createFromRenderArray($build);
$response->addCacheableDependency($cache_metadata);
これをカスタムコントローラーで使用するか、イベントサブスクライバーで実装して、他のモジュール(コアまたはcontrib)からの応答を変更できます。
2.)内部ページキャッシュ
モジュール内部ページキャッシュは、キャッシュメタデータに関係なく、匿名要求に対するすべての応答をキャッシュします。このモジュールをアンインストールして、このキャッシュを無効にすることができます。
代替ソリューション
クライアント側で、すべての要求に異なるクエリ文字列を追加して、新しい応答を取得します。
node/123?_format=json&time=123456789
これにより、内部ページキャッシュと動的ページキャッシュの一部が無効になります。
リファレンス:https : //www.drupal.org/docs/8/core/modules/rest/javascript-and-drupal-8-restful-web-services
エンドポイントのキャッシュを完全に無効にすることを好みます。これは、MaxAgeがゼロのキャッシュ可能な依存関係をResourceResponseオブジェクトに追加することで実行できます。
次に例を示します。
$response = new ResourceResponse($data);
$disable_cache = new CacheableMetadata();
$disable_cache->setCacheMaxAge(0);
$response->addCacheableDependency($disable_cache);
return $response;
addCacheableDependencyて、サイトのパフォーマンスとスケーラビリティを高めることができます。