在自定义块上设置缓存上下文的正确方法是什么?
我遇到了一个问题,即对于注销用户而言,每页应该唯一的一个块不适用。问题是我在视图搜索页面上拥有一个自定义块插件,该插件包含自定义过滤器(有点像自定义替换暴露的过滤器。通过/ admin / structure / block放置的块)。 根据我对Drupal 8的了解,我将缓存上下文添加到构建数组中: public function build() { $search_form = \Drupal::formBuilder()->getForm('Drupal\mymodule\Form\SearchForm'); return [ 'search_form' => $search_form, '#cache' => ['contexts' => ['url.path', 'url.query_args']] ]; } 但是看来这一定是不正确的,因为注销后,该块将在第一个视图上缓存,并且当url更改时,它没有显示该块的新版本。 我认为可能是导致问题的视图页面,但是即使我在视图页面上关闭了缓存,问题仍然存在。 我可以通过几种方式解决此问题,例如,使用preprocess_block挂钩: function mymodule_preprocess_block__mycustomsearchblock(&$variables) { $variables['#cache']['contexts'][] = 'url.path'; $variables['#cache']['contexts'][] = 'url.query_args'; } 但这让我感到困扰,我不能只是将缓存上下文放入块的构建数组中。 由于我的代码块扩展了BlockBase,因此我决定尝试使用getCacheContexts()方法,尤其是因为我看到核心中的某些模块正在这样做。 public function getCacheContexts() { return Cache::mergeContexts(parent::getCacheContexts(), ['url.path', …