Caching 在何处指定要在所有页面上操作的缓存上下文?

Caching 在何处指定要在所有页面上操作的缓存上下文?,caching,drupal-8,Caching,Drupal 8,我想配置我的Drupal 8网站,以便在使用查询参数“refcode”访问我的网站时,该值会复制到该页面上的所有菜单链接上。例如,使用将向该页面上的所有菜单链接添加“?refcode=joe”。一旦有人使用特定的参考代码进入站点,那么使用菜单链接在站点周围导航将保留该参考代码,使用菜单链接导航离开站点也将在外部菜单链接上保留该参考代码 当缓存为空时,此代码起作用: function mymodule_link_alter( &$variables ) { if ( $refcod

我想配置我的Drupal 8网站,以便在使用查询参数“refcode”访问我的网站时,该值会复制到该页面上的所有菜单链接上。例如,使用将向该页面上的所有菜单链接添加“?refcode=joe”。一旦有人使用特定的参考代码进入站点,那么使用菜单链接在站点周围导航将保留该参考代码,使用菜单链接导航离开站点也将在外部菜单链接上保留该参考代码

当缓存为空时,此代码起作用:

function mymodule_link_alter( &$variables )
{
    if ( $refcode = \Drupal::request( )->query->get( 'refcode' ) )
        $variables['options']['query']['refcode'] = $refcode;
}
当页面被缓存时,它不会被缓存。我尝试添加以下内容:

$variables['#cache']['contexts'][]='url.query_args:refcode'


但这是行不通的。我想我必须在其他地方添加这个缓存指令,但我不知道在哪里。在检索任何缓存页面时,有没有一个地方可以让Drupal 8将“refcode”考虑在内?

我终于找到了答案。我必须确定哪些块类型和哪些节点类型可能引用refcode查询参数,并更新它们的缓存设置:

function mymodule_preprocess_block( &$variables )
{
    if ( $variables['base_plugin_id'] == 'system_menu_block' )
        $variables['#cache']['contexts'][] = 'url.query_args:refcode';
}

function mymodule_preprocess_node( &$variables )
{
    if ( $variables['node']->bundle( ) == 'main' )
        $variables['#cache']['contexts'][] = 'url.query_args:refcode';
}