Symfony5升级后省略_format默认html时URL路由未找到问题
Symfony 4升级5后无格式后缀路由404问题
问题表现
项目从Symfony 4升级至Symfony 5后出现路由匹配异常:访问未携带请求格式标识的路由时,系统直接抛出路由未找到错误,相同配置在Symfony 4版本下可正常运行。
原有路由配置(routing.yml)
reportbook: path: /report.{_format}/{user_id} methods: [GET] requirements: _format: html|json|pdf defaults: _controller: Controller\ReportController::showAction _format: html user_id: ~
访问测试结果
- 访问
example.com/report/12345:匹配失败,提示路由未找到 - 访问
example.com/report.html/12345:匹配正常 - 访问
example.com/report.json/12345:匹配正常 - 访问
example.com/report.pdf/12345:匹配正常
预期逻辑
配置中已为_format参数指定默认值html,未携带格式后缀时应默认按html格式匹配响应。
问题原因
Symfony 5调整了路由可选参数的分隔符匹配规则:当可选参数和路径中的固定字符(此场景下为_format前的.)绑定、位于路径段中间时,框架不会自动将前置的固定分隔符标记为可选,导致不带后缀的路径无法命中.{_format}段的匹配规则。
修复方案
将.分隔符移入_format的匹配正则中,显式标记整个格式段(含前置点)为可选,修改后的配置如下:
reportbook: path: /report{_format}/{user_id} methods: [GET] requirements: _format: \.(html|json|pdf)? defaults: _controller: Controller\ReportController::showAction _format: html user_id: ~
修改后验证结果:
- 访问无后缀路径
/report/12345时,_format匹配空值,自动使用默认值html完成路由匹配 - 原有带
.html/.json/.pdf后缀的路径匹配逻辑完全不受影响,无需调整前端调用地址
内容的提问来源于stack exchange,提问作者Robert K
相关产品推荐
相关产品推荐

