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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 23:06:07