Symfony2中doctrine:generate:crud是否自动生成CRUD路由?
我来帮你理清这个问题,毕竟Symfony2的CRUD生成器初期确实容易踩这种小坑😉
1. doctrine:generate:crud是否应该自动生成路由?
答案是肯定的,这个命令完全可以自动生成CRUD对应的路由,但有个关键前提:你在执行命令的交互过程中,必须确认「生成路由配置」的选项为yes。
很多人容易忽略这个步骤——当命令问到:
Do you want to generate the XML/annotation/YAML routing configuration? (yes/no) [no]:
如果默认选了no(或者你没注意直接回车),那生成器只会创建控制器和模板,不会生成任何路由配置文件,也不会给控制器添加路由注解。这就是你之前没看到路由生成的原因。
2. 如何让命令自动生成路由?
重新执行doctrine:generate:crud命令,这次仔细跟着交互步骤走:
- 输入你的实体类(比如
AcmeDemoBundle:Product) - 输入路由前缀(比如
/products) - 当问到是否生成路由配置时,输入
yes,然后选择你偏好的路由格式(推荐annotation或yaml) - 按需选择是否生成写操作(new/edit/delete)等其他选项
完成后,你会看到:
- 如果选了
annotation:控制器类的每个CRUD方法上都会自动添加@Route和@Method注解 - 如果选了
yaml/xml:会在你的bundle的Resources/config/routing/目录下生成对应的路由文件,同时自动在app/config/routing.yml里添加引入配置
3. 手动创建CRUD路由的高效方式
如果不想重新生成命令,或者需要自定义路由,完全不用手动写每个CRUD动作的路由——Symfony2提供了快捷的路由映射方式:
方式一:注解路由(推荐)
确保你的控制器已经通过doctrine:generate:crud生成了带有@Route注解的方法,然后在app/config/routing.yml里添加:
your_bundle_crud: resource: "@YourBundle/Controller/YourEntityController.php" type: annotation prefix: /your-route-prefix
这样Symfony会自动识别控制器里所有带@Route注解的方法,一次性映射所有CRUD路由。
方式二:YAML批量路由
如果用YAML格式,可以在bundle的Resources/config/routing/your_entity.yml里写:
your_entity_index: path: / defaults: { _controller: YourBundle:YourEntity:index } methods: GET your_entity_show: path: /{id} defaults: { _controller: YourBundle:YourEntity:show } methods: GET # 以此类推,new、create、edit、update、delete动作的路由
然后在app/config/routing.yml里引入这个文件:
your_bundle_crud: resource: "@YourBundle/Resources/config/routing/your_entity.yml" prefix: /your-route-prefix
不过相比之下,注解路由更简洁,也更符合Symfony2后期版本的推荐实践。
小提醒
如果之前你手动定义过路由,要注意避免路径冲突——自动生成的路由和手动路由如果前缀或路径重复,会导致路由匹配异常,建议统一用一种方式管理CRUD路由。
内容的提问来源于stack exchange,提问作者Sara Lqadi

