私はDrupal 8のモジュールで作業しており、外部のREST apiから時間に依存するデータを取得します。データは処理され、ブロックに転送されます。最終的なデータはTwigテンプレートに次のように送信されます:
...
public function build() {
$build = [];
$build['ticker_block'] = [
'#theme' => 'module_theme',
'#data' => $myService->data(),
];
return $build;
}
これは、キャッシュが有効になっている本番環境では機能せず、レンダリングされたデータが古くなったように表示されます。モジュールのみのキャッシュを無効にするにはどうすればよいですか。また、Twigテンプレートとブロックプラグインの両方で無効にする必要がありますか?
#cache要素を使用して、レンダー配列のキャッシュを制御できます。
キャッシュの追加を無効にするには:
$build['#cache']['max-age'] = 0;
この場合、ブロックは、ログインしているユーザーまたはセッションを持つ匿名ユーザーに対してはキャッシュされません。
セッションなしで匿名ユーザーのキャッシュを無効にする場合:
Page_cacheモジュールを完全にアンインストールするか、killスイッチをトリガーして無効にします。たとえば、 特定のページがキャッシュされないようにするにはどうすればよいですか? を参照してください。
twigコードのキャッシュはこれに接続されていません。twigコードは一度キャッシュされるだけで、キャッシュをクリアした後で初めて使用されるときです。
(Berdirのコメントに従って編集)
特定のブロックのキャッシュを停止するには、次の関数を使用します。
/**
* Implements hook_preprocess_HOOK() for block.html.twig.
*/
function template-name_preprocess_block(&$vars) {
if($vars['derivative_plugin_id'] == 'add-block-id-name') {
//-- This stops the block being cache in drupal 8
$vars['#cache']['max-age'] = 0;
}
}
特定のページ/コンテンツタイプ/コントローラーのキャッシュを無効にする
ルート宣言からのカスタムページのキャッシュを無効にします。
カスタムコントローラー(カスタムモジュール)のキャッシュを無効にする場合は、
no_cache
オプション(YOUR_MODULE.routing.yml)。例:ファイル:mymodule.routing.yml
mymodule.myroute:
path: '/mymodule/mypage'
defaults:
_controller: '\Drupal\mymodule\Controller\Pages::mypage'
_title: 'No cache page'
requirements:
_access: 'TRUE'
options:
no_cache: 'TRUE'
ブロックタイプのキャッシュを無効にするには、そのタイプのブロックを前処理し、max_ageを0に設定します。
/**
* Implements hook_preprocess_HOOK() for Block document templates.
*/
function THEMENAME_preprocess_block(array &$variables) {
//disbale cache from spotlight
$content = $variables['elements']['content'];
//dump($content); //check the contents
if (isset($content['#block_content']) && $content['#block_content'] instanceof BlockContentInterface) {
if ($content['#block_content']->bundle() == 'BLOCK_TYPE') {
$variables['#cache']['max-age'] = 0;
}
}
}
特定のブロックのキャッシュを防止するには:
以下のコードをtheme_name.themeファイルに追加します
function theme_name_preprocess_block(&$variables) {
if ($variables['plugin_id'] == 'block_id') {
$variables['#cache']['max-age'] = 0;
}
}