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
相关产品推荐
相关产品推荐

