web-dev-qa-db-ja.com

特定のモジュールのTwigおよびブロックキャッシュを無効にする方法を教えてください。

私はDrupal 8のモジュールで作業しており、外部のREST apiから時間に依存するデータを取得します。データは処理され、ブロックに転送されます。最終的なデータはTwigテンプレートに次のように送信されます:

...

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

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

  return $build;
}

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

15
estrar

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

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

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

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

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

Page_cacheモジュールを完全にアンインストールするか、killスイッチをトリガーして無効にします。たとえば、 特定のページがキャッシュされないようにするにはどうすればよいですか? を参照してください。

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

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

27
4k4

特定のブロックのキャッシュを停止するには、次の関数を使用します。

/**
 * 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;
  }
}
6
echo

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

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

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

3
Vladislav

ブロックタイプのキャッシュを無効にするには、そのタイプのブロックを前処理し、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;
        }

      }


    }
0
Wasim Khan

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

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

function theme_name_preprocess_block(&$variables) {
  if ($variables['plugin_id'] == 'block_id') {
    $variables['#cache']['max-age'] = 0;
  }
}
0
Rimi B