如何在Sonata中移除KNP菜单里的「default」默认分组
移除Sonata Admin中自动生成的「default」菜单分组并自定义分组
方法1:直接在Admin服务标签指定自定义分组(推荐)
这是最简洁的处理方式,无需额外编写监听器,直接在Admin服务的sonata.admin标签中添加group属性,就能让Admin类直接归入你指定的分组,不会再生成「default」分组。
修改你的服务定义:
App\Admin\TaskAdmin: tags: - { name: sonata.admin, model_class: App\Entity\Task, manager_type: orm, label: Task, group: '任务管理' }
设置后,Task的菜单会直接出现在「任务管理」分组下,「default」分组不会自动生成。
方法2:通过菜单监听器移除「default」分组并重组菜单
如果已有多个Admin类被自动归入「default」,或者需要更灵活的菜单控制逻辑,可以通过菜单监听器来处理:
修改MenuBuilderListener类
遍历侧边栏菜单,找到「default」分组并移除,同时将其下的子项迁移到自定义分组:
final class MenuBuilderListener { public function addMenuItems(ConfigureMenuEvent $event): void { $menu = $event->getMenu(); // 定位default分组 $defaultGroup = null; foreach ($menu->getChildren() as $child) { if ($child->getName() === 'default') { $defaultGroup = $child; break; } } if ($defaultGroup) { // 保存default下的所有子菜单 $defaultChildMenus = $defaultGroup->getChildren(); // 移除default分组 $menu->removeChild($defaultGroup); // 创建自定义分组(如果不存在) $customGroup = $menu->getChild('custom_task_group') ?? $menu->addChild('custom_task_group', [ 'label' => '任务管理', ]); // 将原default的子菜单添加到自定义分组 foreach ($defaultChildMenus as $item) { $customGroup->addChild($item); } } } }
处理顶部导航栏的「创建」菜单(加号下拉)
顶部导航栏的加号下拉菜单同样会生成「default」分组,需要监听另一个事件来处理:
更新监听器服务定义
添加监听sonata.admin.event.configure.menu.create事件的标签:
app.menu_listener: class: App\EventListener\MenuBuilderListener tags: - { name: kernel.event_listener, event: sonata.admin.event.configure.menu.sidebar, method: addMenuItems } - { name: kernel.event_listener, event: sonata.admin.event.configure.menu.create, method: configureCreateMenu }
在MenuBuilderListener中添加处理方法
public function configureCreateMenu(ConfigureMenuEvent $event): void { $menu = $event->getMenu(); // 移除创建菜单中的default分组 $defaultCreateGroup = $menu->getChild('default'); if ($defaultCreateGroup) { $createItems = $defaultCreateGroup->getChildren(); $menu->removeChild($defaultCreateGroup); // 创建自定义创建分组 $customCreateGroup = $menu->getChild('custom_task_create_group') ?? $menu->addChild('custom_task_create_group', [ 'label' => '任务相关创建', ]); foreach ($createItems as $item) { $customCreateGroup->addChild($item); } } }
补充说明
Bundle自带的Admin类(比如SonataMediaBundle)不会归入「default」分组,是因为它们的服务定义中已经明确指定了group属性,比如SonataMediaBundle的Admin标签会设置group: 'Media Library',从而跳过默认的「default」分组。
内容的提问来源于stack exchange,提问作者codeWanderer
相关产品推荐
相关产品推荐

