特定のモジュールのTwigとブロックキャッシュを無効にするにはどうすればよいですか?


15

外部REST APIから時間依存データを取得するDrupal 8のモジュールに取り組んでいます。データが処理され、ブロックに転送されます。最終データは次のようにTwigテンプレートに送信されます。

...

public function build() {
  $build = [];

  $build['ticker_block'] = [
    '#theme' => 'module_theme',
    '#data' => $myService->data(),
  ];

  return $build;
}

これは、キャッシュが有効になっており、レンダリングされたデータが古いものとして表示される運用環境では機能しません。モジュールのキャッシュのみを無効にするにはどうすればよいですか?また、TwigテンプレートとBlockプラグインの両方でキャッシュを無効にする必要がありますか?

回答:


27

#cache要素を使用して、レンダー配列のキャッシュを制御できます。

キャッシュの追加を無効にするには:

$build['#cache']['max-age'] = 0;

この場合、ログインしているユーザーまたはセッションを持つ匿名ユーザーのブロックはキャッシュされません。

セッションなしで匿名ユーザーのキャッシュを無効にする場合:

page_cacheモジュールを完全にアンインストールするか、killスイッチをトリガーして無効にします 。特定のページがキャッシュされないようにする方法をご覧ください。例えば。

小枝コードのキャッシュはこれに接続されていません。小枝コードは、キャッシュをクリアした後に初めて使用されるときに一度だけキャッシュされます。

(Berdirのコメントに従って編集)


この特定のケースではキャッシュコンテキストは役に立たないと思いますが、60のようにキャッシュを完全に無効にする0の代わりに実際のmax-ageを使用したい場合があります。 1〜2、3秒間キャッシュされます。また、max-ageは匿名ページキャッシュに影響を与えないことに注意してください。匿名ユーザーにこれが必要な場合は、完全に無効にするか、javascriptを使用してデータを取得する必要があります。
ベルディール

@Berdir:匿名ユーザーにはmax-age = 0を使用しますが、セッションには使用します。これは現在devで機能しています。これは生産に問題ないと思いますか?完全に無効にするとはどういう意味ですか?
4k4

セッションがある場合は問題ありませんが、動作します。page_cacheモジュールを完全にアンインストールするか、killスイッチをトリガーして無効にします。たとえば、drupal.stackexchange.com / questions / 151254 /…を参照してください。
ベルディール

素晴らしい情報をありがとう、答えにこれを追加しました。
k4

1
$ build ['#cache'] ['max-age'] = 0; トリックをしました!!! ビールが一杯!:)
ソリン

6

特定のブロックのキャッシュを停止するには:

/**
 * 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;

  }

素晴らしい答え。
生徒

2

特定のページ/コンテンツタイプ/コントローラーのキャッシュを無効にする

ルート宣言からカスタムページのキャッシュを無効にします。

カスタムコントローラ(カスタムモジュール)のキャッシュを無効にする場合、 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'

ルートの応答をキャッシュ不可としてマークする「no_cache」ルートオプションを追加


0

特定のブロックのキャッシュを防ぐには:

theme_name.themeファイルに以下のコードを追加します

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.