Symfony中使用Twig cache标签时如何删除指定key的缓存条目?
解决方案
方案1:改用缓存标签机制(更推荐,适配所有更新/删除场景)
你可以直接利用Twig cache标签原生支持的标签能力,不用将updatedAt嵌入缓存键名来做版本控制:
- Twig模板中修改缓存声明,给对应缓存块绑定专属标签:
{% cache "post-" ~ post.id tags: ["post-" ~ post.id, "category-" ~ post.category.id] %} {# 原有模板内容 #} {% endcache %}
- 在事件订阅器中监听
Post实体的更新、关联分类/评论变动、删除事件,统一调用缓存标签失效方法即可,不管是更新还是删除都能一次性清掉所有关联的缓存块:
// 注入Symfony的缓存适配器,默认可使用twig.cache对应的缓存池 $this->cacheAdapter->invalidateTags(['post-' . $post->getId()]);
这种方式不用手动维护updatedAt字段,也不需要拼接缓存键,后续有其他关联资源变动需要清缓存只需要新增对应标签即可。
方案2:兼容现有键名设计的处理方式
如果你不想改动现有缓存键逻辑,可以在删除事件的preRemove阶段获取待删除Post的完整属性,拼接出对应的缓存键主动删除即可:
- 给你的事件订阅器添加
preRemove事件监听,该事件触发时实体还未从数据库移除,可以正常拿到id和updatedAt字段 - 拼接出你当前使用的缓存键
post-{id}-{updatedAt},调用缓存池的删除方法即可:
$cacheKey = 'post-' . $post->getId() . '-' . $post->getUpdatedAt()->getTimestamp(); $this->cacheAdapter->deleteItem($cacheKey);
补充说明
如果你的缓存配置了合理的过期时间,Post删除后对应的旧缓存即使不主动清理,到期后也会自动失效,不会产生业务逻辑问题,只是会短暂占用少量缓存存储空间,对缓存空间不敏感的场景可以不用额外处理。
内容的提问来源于stack exchange,提问作者Phiphou
相关产品推荐
相关产品推荐

