You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 04:37:38