Symfony3后台多级菜单URL路由配置问题求助
我来帮你理一理这个问题,核心是你搞混了路由名称和URL路径的区别——url()和path()函数接收的是路由的注册名称,不是直接的URL路径或者控制器路径哦!
下面是具体的解决步骤:
1. 先找到目标页面的路由名称
Symfony的路由系统是靠「路由名称」来映射到具体路径的,你需要先确认myapp/admin/gameadmin这个路径对应的路由名称是什么。
打开终端,在项目根目录运行这个命令:
php bin/console debug:router
这个命令会列出所有已注册的路由,找到路径为/admin/gameadmin(或者带项目前缀的完整路径)的那条记录,看它的Name列,比如可能是admin_gameadmin或者app_admingame_index,这个名称才是你要传给url()的参数。
如果路由太多,也可以用过滤命令快速查找:
php bin/console debug:router | grep gameadmin
2. 检查控制器的路由配置
打开你的AdmingameController.php,看对应方法的路由注解(如果用注解路由的话),应该是类似这样的:
<?php namespace AppBundle\Controller\Admin; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route; class AdmingameController extends Controller { /** * @Route("/gameadmin", name="admin_gameadmin") */ public function indexAction() { // 控制器逻辑 return $this->render('admin/gameadmin/index.html.twig'); } }
这里的name="admin_gameadmin"就是路由的名称,也是你要在模板里用的关键。
如果是用YAML/XML配置路由(比如在AppBundle/Resources/config/routing/admin.yml),配置应该是这样:
admin_gameadmin: path: /gameadmin defaults: { _controller: AppBundle:Admin/Admingame:index }
同样,admin_gameadmin就是路由名称。
3. 在模板里正确调用路由
确认路由名称后,在模板的href里这样写:
<a href="{{ url('admin_gameadmin') }}">游戏管理</a>
或者用path()(生成相对路径,大部分场景下和url()效果一致):
<a href="{{ path('admin_gameadmin') }}">游戏管理</a>
4. 常见误区排查
- 不要直接把URL路径(比如
admin/gameadmin)传给url(),必须用路由名称 - 路由名称一般是小写字母加下划线的格式,不会用斜杠、冒号或者反斜杠分隔
- 确认你的Admin目录下的路由是否被正确注册:比如在项目的主路由文件
app/config/routing.yml里,有没有包含Admin控制器的路由配置:
admin: resource: "@AppBundle/Controller/Admin/" type: annotation prefix: /admin
这里的prefix: /admin会给Admin目录下的所有路由加上/admin前缀,所以控制器里的@Route("/gameadmin")最终会生成/admin/gameadmin的路径,和你要的目标URL一致。
内容的提问来源于stack exchange,提问作者julien mantovani

