路由 name 必须全局唯一,重复定义会导致容器编译失败并报错“The route 'xxx' is already defined”;命名应遵循 app_模块_动作 格式,仅允许字母、数字、下划线和点号,且不参与URL匹配,但为生成URL、调试、权限控制等反向操作的必需标识。

路由 name 必须全局唯一,否则启动报错
Symfony 在解析路由时会把 name 当作键存入内部映射表,重复定义(比如两个 @Route 注解用了相同的 name="blog_show")会导致容器编译失败,错误信息类似:The route "blog_show" is already defined。这不是警告,是硬性限制。
- 命名建议用
app_模块_动作格式,例如app_user_profile、app_admin_dashboard - 避免纯数字、下划线开头、或含空格/特殊符号(只允许字母、数字、下划线、点号)
- YAML 配置中
name是顶层键,不能嵌套在defaults或requirements里
@Route 注解里写 name 最直接
注解方式下,name 是 @Route 的一个必需(或强推荐)参数。不写 name 不报错,但后续无法用 $this->generateUrl('xxx') 或命令行调试(如 php bin/console debug:router blog_show)。
- 基础写法:
/** @Route("/blog/{id}", name="blog_show") */ - 带默认值和约束时,
name仍平级写:/** @Route("/blog/{slug}", name="blog_detail", defaults={"slug": "home"}, requirements={"slug": "[a-z0-9-_]+"}) */ - 注意:同一个控制器方法不能有多个
@Route注解共用一个name;如果要支持多路径(如带 locale 和不带 locale),应使用不同name,或改用/{_locale}/{slug}+defaults={"_locale": "en"}的单一路由覆盖
YAML 配置中 name 是第一级字段
在 config/routes/ 下的 YAML 文件里,name 不是子项,而是每条路由的标识符,和 path、controller 并列。
当代理已经知道网站路由或内容URL,并且在启动前需要有效的sitemap XML、sitemap索引或robots.txt引用时,请使用sitemap。这是一个发布构件技能,而不是爬虫或SEO平台。
blog_list:
path: /blogs
controller: App\Controller\BlogController::list
methods: [GET]
<p>blog_show:
path: /blog/{id}
controller: App\Controller\BlogController::show
requirements:
id: '\d+'</p>- 上面例子中
blog_list和blog_show就是路由名,冒号前的部分 - 不要写成
name: blog_show—— YAML 方式下它就是 key 本身,不是 value - 导入其他文件时,被导入路由的 name 依然有效,且需保证跨文件不重名
name 不参与 URL 匹配,但影响所有生成和调试操作
name 本身不会改变路由匹配逻辑,但它是一切「反向操作」的基础:生成 URL、跳转、测试、缓存键、安全权限绑定(如 is_granted('ROLE_ADMIN') 配合路由名做访问控制)都依赖它。
- 改了
name后,所有调用generateUrl()的地方都要同步更新,否则运行时报Unable to generate a URL for the named route "xxx" -
php bin/console debug:router列出的全是name,不是路径;php bin/console router:match /blog/123输出里也会显示命中了哪个name - 调试栏(Web Profiler)的 router 面板只有开了
router: true才显示当前请求对应的name和参数,否则你根本不知道实际走的是哪条路由
别以为 name 只是“起个名字”——它实质上是路由的身份证,漏设、重名、拼错,都会在生成链接或调试时立刻暴露。


















