web-dev-qa-db-ja.com

URLクエリ文字列に基づいて出力を調整する方法

私のノードの前処理関数で、クエリパラメータの値を確認します...

$variables['exclude_urls'] = \Drupal::request()->get('exclude_urls');

そして、私のテンプレートには...

{% if not exclude_urls %}
  <div class="gr-url">{{ url }}</div>
{% endif %}

ただし、「exclude_urls」パラメーターの値以外にURLで何も変更されない場合、ノードの前処理関数が起動しないため、このアプローチは機能しません。

ページのキャッシュを無効にするさまざまな方法を試しました。これをルートに追加しても機能しません...

  options:
    no_cache: 'TRUE'

私はコントローラーでpage_cache_kill_switchも使用しようとしましたが、機能しません...

\Drupal::service("page_cache_kill_switch")->trigger();

キャッシュコンテキストにクエリパラメータを追加することもしません...

$element['#cache']['contexts'][] = 'url.query_args:exclude_urls';

Hook_preprocess_nodeを使用する代わりに、$ _ GET ['exclude_urls']の値を確認し、それをテンプレートに渡す方法は他にありますか? twigテンプレート自体にコードを追加して、 'exclude_urls'の値を確認しますか?毎回hook_preprocess_nodeを強制的に実行する確実な方法はありますか?コンテンツの表示を調整する通常のアプローチは何ですか?キャッシュが干渉しないように、URLクエリパラメータに基づいていますか?

更新:明確にするために、私は上記のアプローチを組み合わせて試みましたが、成功しませんでした。たとえば、コントローラーのページ機能の最後は次のようになります...

\Drupal::service("page_cache_kill_switch")->trigger(); 
$element['#cache']['contexts'][] = 'url.query_args:exclude_urls';
return $element;

pdate 2:私のローカル開発サイトでは、この問題は発生していません。ローカル設定のこの行が原因で、hook_preprocess_nodeが毎回起動することがわかりました...

$settings['cache']['bins']['render'] = 'cache.backend.null';

ただし、一般的にレンダーキャッシュを無効にしたくないので、本番サイトでこれを利用する方法がわかりません。私はsettings.phpでこのようなことをすることができますが、それはハックです:

$parts = explode('?', $_SERVER['REQUEST_URI'], 2);
if ('/disable/cache/at/this/path' == $parts[0]) {
  $settings['cache']['bins']['render'] = 'cache.backend.null';
}
3
arnoldbird

レンダリングされたコンテンツをキャッシュできる3つのレイヤーがあります。

  • ページキャッシュ。匿名ユーザーのURLに基​​づいて完全なページを保存します。
  • 動的ページキャッシュ。各リクエストでレンダリングされる動的コンテンツのプレースホルダーを含むページを格納します。
  • レンダリングキャッシュ。レンダリングされた個々の要素を格納します。

それぞれに対応するキャッシュビンがあり、開発中にsettings.phpで無効にすることができます。


hook_preprocessに追加のキャッシュコンテキストを設定して、ダイナミックページキャッシュがそのフラグメントを再レンダリングし、必要に応じてレンダーキャッシュにバリアントを保存できるようにするには、#cache変数を更新します。

function hook_preprocess_HOOK(&$variables) {
  $variables['#cache']['contexts'][] = 'url.query_args:exclude_urls';
}
3
gapple