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

Symfony 6 控制器统计计数异常:点击链接不递增刷新才生效

问题原因与解决方案

核心原因

浏览器会对PDF这类资源的响应做缓存处理。当你通过首页链接访问/test路由时,浏览器首次请求后会缓存返回的PDF内容;后续点击相同链接时,直接读取本地缓存,不会向服务器发起新请求,控制器内的统计逻辑自然不会执行。而刷新页面时,浏览器会强制发送新请求(绕过缓存),所以计数能正常递增。

另外注意你的路由注解存在语法错误:#[Route('/test', name: 'app_test)]末尾缺少闭合引号,应修正为#[Route('/test', name: 'app_test')],这个错误可能引发其他意外问题。

解决方案

通过设置HTTP缓存控制头,禁止浏览器缓存该请求,确保每次访问都触发控制器逻辑。修改代码如下:

#[Route('/test', name: 'app_test')]
public function test(ManagerRegistry $doctrine): Response
{
    $newView = new testStats();
    $newView->setDate(new DateTime());
    $em = $doctrine->getManager();
    $em->persist($newView);
    $em->flush();
    
    // 获取文件响应对象
    $response = $this->file("../public/docs/test/test.pdf", null, ResponseHeaderBag::DISPOSITION_INLINE);
    
    // 添加缓存控制头,强制浏览器每次都重新请求
    $response->headers->set('Cache-Control', 'no-cache, no-store, must-revalidate');
    $response->headers->set('Pragma', 'no-cache');
    $response->headers->set('Expires', '0');
    
    return $response;
}

这些HTTP头的作用:

  • Cache-Control: no-cache, no-store, must-revalidate:明确禁止浏览器缓存内容,要求每次请求都向服务器验证
  • Pragma: no-cache:兼容HTTP/1.0协议的缓存控制规则
  • Expires: 0:将过期时间设为过去,让浏览器认为内容已过期,必须重新请求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 22:07:13