symfony 7.0 默认启用 php attributes 定义路由,需确保 framework.yaml 启用 annotations、routes.yaml 导入控制器资源、正确使用 #[route] 属性并清缓存验证。

Symfony 7.0 默认启用 PHP Attributes(属性注解)定义路由,不再依赖 SensioFrameworkExtraBundle 或旧式 @Route 注解。这种方式更现代、类型安全、IDE 友好,但需注意配置和缓存细节。
确保注解路由已启用
Symfony 7.0 开箱即用支持 #[Route],无需额外安装 bundle。但要确认以下两点:
-
config/packages/framework.yaml 中存在
annotations: true(默认已开启) - config/routes.yaml 包含标准控制器资源导入,例如:
resource: ../../src/Controller/
type: annotation
如果删掉了这段,注解将完全不被扫描——这是 404 却找不到原因的最常见配置遗漏。
正确书写 #[Route] 属性
使用 PHP 8+ 属性语法,注意命名空间和参数写法:
- 必须引入
Symfony\Component\Routing\Annotation\Route - 路径、名称、方法、约束、默认值都通过命名参数传入
- 正则约束中的反斜杠要用单引号包裹,如
requirements: ['id' => '\d+'] - 可选参数路径加
?,方法参数同步设默认值
示例:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
#[Route('/user/{id?1}', name: 'user_show', methods: ['GET'])]
public function show(int $id = 1): Response
{
return new Response("User ID: $id");
}
修改后必须清缓存
注解在编译时生成路由表,不是运行时解析。开发中增删改 #[Route] 后,必须执行:
否则旧路由仍生效,新路由 404,或旧路由残留响应。这不是 bug,是设计使然。建议养成保存代码后顺手清缓存的习惯。
调试与验证路由
命令行是最快验证方式:
-
php bin/console debug:router查看全部已注册路由 -
php bin/console debug:router user_show查看某条路由详情(匹配规则、默认值、约束等) -
php bin/console router:match /user/123模拟请求,看是否命中目标控制器
这些命令会实时反映缓存清除后的最新状态,比刷新浏览器更可靠。










