未生成子管理员路由 - Sonata Admin Bundle
Posted
技术标签:
【中文标题】未生成子管理员路由 - Sonata Admin Bundle【英文标题】:Child Admin route is not being generated - Sonata Admin Bundle 【发布时间】:2015-04-22 13:26:16 【问题描述】:我正在尝试将管理员设置为 Sonata Admin Bundle 中其他管理员的子级。
我有 2 个管理类:
分类管理 该类包含以下方法
protected function configureSideMenu(MenuItemInterface $menu, $action, AdminInterface $childAdmin = null)
$id = $this->getRequest()->get('id');
$menu->addChild(
$this->trans('Projects'),
array('uri' => $this->getChild('sonata.admin.project')->generateUrl('list', array('id' => $id)))
);
项目管理员
此类包含protected $parentAssociationMapping = 'category';
category
是模型类中表示多对一关联的属性。
我在 CategoryAdmin 的服务配置中添加了以下几行
calls:
- [ addChild, ["@sonata.admin.project"]]
没有使用此配置生成子管理员的路由。 SideMenu(顶部菜单)中的链接指向/admin/project/list?childId=1&id=1
这是CategoryAdmin
和dump()
的孩子的输出
array:1 [▼
"sonata.admin.project" => ProjectAdmin #406 ▶
]
这意味着我的子管理员的配置似乎是正确的。我不知道为什么没有生成子管理员的路由。
我希望有人能给我一个提示,问题可能是什么。
【问题讨论】:
【参考方案1】:下一代奏鸣曲编码员注意事项: 如果你的路线没有被生成,首先检查你没有做:
protected function configureRoutes(RouteCollection $collection)
//clear all routes except given !!!
$collection->clearExcept(array('list', 'show'));
我花了两天时间...
【讨论】:
可能只是救了我几天!【参考方案2】:您的管理类中是否覆盖了 $baseRouteName 和 $baseRoutePattern ?
如果这样做,Sonata 将生成具有相同名称的子路由和父路由,从而导致父路由覆盖子路由。
【讨论】:
有没有办法解决这个问题?我必须定义$baseRouteName
和 $baseRoutePattern
因为否则 Sonata 会拒绝我的无供应商捆绑包(例如 src/AppBundle/ )
如果使用 Dev-master 版本的 SonataAdminBundle 没有问题,那么这个 bug 已经解决了 (github.com/sonata-project/SonataAdminBundle/pull/3250)。如果没有,您可以覆盖 getBaseRoutePattern 和 getBaseRouteName 来修复该行为。【参考方案3】:
我在为自己解决问题时遇到了这个问题,并决定分享解决方案,这花了我几个小时的调试时间......
在这种情况下,生成正确 uri 的唯一方法是使用 low-level routeGenerator
,它不会在 generateMenuUrl
方法中提出任何奏鸣曲建议。
首先,您必须调试应用中的路线(包括由奏鸣曲自动生成的)。
php bin/控制台调试:路由器
例如我有 3 个嵌套级别
大厅 -> 座位方案 -> 部门
我的路线如下:
adminHall_list ANY ANY ANY /admin/hall/list
adminHall_create ANY ANY ANY /admin/hall/create
adminHall_edit ANY ANY ANY /admin/hall/id/edit
adminHall_delete ANY ANY ANY /admin/hall/id/delete
adminHall_adminScheme_list ANY ANY ANY /admin/hall/id/scheme/list
adminHall_adminScheme_create ANY ANY ANY /admin/hall/id/scheme/create
adminHall_adminScheme_edit ANY ANY ANY /admin/hall/id/scheme/childId/edit
adminHall_adminScheme_delete ANY ANY ANY /admin/hall/id/scheme/childId/delete
adminHall_adminScheme_adminSector_list ANY ANY ANY /admin/hall/id/scheme/childId/sector/list
adminHall_adminScheme_adminSector_create ANY ANY ANY /admin/hall/id/scheme/childId/sector/create
adminHall_adminScheme_adminSector_edit ANY ANY ANY /admin/hall/id/scheme/childId/sector/childChildId/edit
adminHall_adminScheme_adminSector_delete ANY ANY ANY /admin/hall/id/scheme/childId/sector/childChildId/delete
在管理类中 baseRouteName 和 baseRoutePattern 已被覆盖。
// HallSchemeAdmin.php
$this->baseRouteName = 'adminScheme';
$this->baseRoutePattern = 'scheme';
要生成一个最深度列表网址:
$url = $admin->getRouteGenerator()->generate('adminHall_adminScheme_adminSector_list', [
'id' => $admin->getRequest()->get('id'),
'childId' => 555, // put required id
]);
它会产生这样的url:
/admin/hall/495/scheme/555/sector/list
如果您需要编辑网址,您也必须提供childChildId
参数:
$url = $admin->getRouteGenerator()->generate('adminHall_adminScheme_adminSector_edit', [
'id' => $admin->getRequest()->get('id'),
'childId' => 555,
'childChildId' => 12345
]);
结果是:
/admin/hall/495/scheme/555/sector/12345/edit
【讨论】:
以上是关于未生成子管理员路由 - Sonata Admin Bundle的主要内容,如果未能解决你的问题,请参考以下文章
Sonata admin 基于 ODM 的子管理员在基于 ORM 的管理员上
在 symfony sonata 管理包的不同子菜单中拆分域