You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HttpCacheHitEvent订阅器中获取或创建Context?

从HttpCacheHitEvent获取适配请求参数的上下文方案

在处理HttpCacheHitEvent时,要构建适配请求动态参数(如locale)的上下文,核心思路是从事件关联的当前请求中提取动态数据,而非依赖静态的默认上下文,具体实现步骤如下:

1. 从事件中获取当前请求实例

HttpCacheHitEvent提供了getRequest()方法,直接调用就能拿到当前请求的Symfony\Component\HttpFoundation\Request实例,里面包含了所有请求级别的动态参数。

2. 提取所需的上下文参数

从请求中提取你需要的动态数据,比如区域设置、请求域名、用户身份等:

  • 区域设置:$request->getLocale()
  • 请求域名:$request->getHost()
  • 认证用户角色(若有):$request->getUser()->getRoles()(需确保请求已认证)

3. 构建或扩展上下文

不要使用静态的Context::createDefaultContext(),而是基于提取的参数创建或扩展上下文:

示例代码

use Symfony\Component\HttpKernel\Event\HttpCacheHitEvent;
use Symfony\Component\HttpKernel\HttpCache\Context;

class CacheHitContextSubscriber
{
    public function onHttpCacheHit(HttpCacheHitEvent $event): void
    {
        // 获取当前请求
        $request = $event->getRequest();
        
        // 提取动态参数
        $locale = $request->getLocale();
        $domain = $request->getHost();
        
        // 构建自定义上下文
        $context = new Context();
        $context->addParameter('_locale', $locale);
        $context->addParameter('_domain', $domain);
        
        // 若需要保留默认上下文的基础参数,可先创建默认再扩展
        // $context = Context::createDefaultContext();
        // $context->addParameter('_locale', $locale);
        
        // 后续使用上下文,比如生成缓存区分哈希
        $contextHash = $context->generateHash();
        // 执行你的业务逻辑,比如提取对应上下文的数据
    }
}

关键说明

  • Context::createDefaultContext()的局限性:它基于全局配置生成静态上下文,不会随当前请求的动态参数变化,无法适配不同locale、用户等场景的缓存区分需求。
  • 上下文的作用:通过向Context添加动态参数,生成的哈希值会随参数变化而不同,从而让HttpCache为不同请求场景维护独立的缓存条目,确保缓存命中的准确性。

内容的提问来源于stack exchange,提问作者MweisSW

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 03:20:15