ronappleton/menubuilder

Laravel 导航菜单构建器

dev-master 2017-12-20 05:24 UTC

This package is auto-updated.

Last update: 2024-09-10 08:23:16 UTC


README

信用

MenuBuilder 是由 Jeroen Noten 的 jeroennoten/Laravel-AdminLTE 包中的 MenuBuilder 演变而来,其前提非常出色,这也是为什么我想将其用作一个更好的菜单系统的基础,该系统可以轻松与 Laravel 集成。

关于 MenuBuilder

MenuBuilder 是一个用于构建 Laravel 应用程序菜单的包,使用它,您可以创建尽可能多的菜单,并在任何需要的地方使用它们,甚至可以使用它创建您自己的导航栏菜单。

安装

安装 MenuBuilder 非常简单,只需

    composer require ronappleton/menubuilder "dev-master"

Laravel 将发现该包并使其可用。

下一步是发布配置文件和视图(您只需要 views 目录中的 menu-item.blade.php 视图,但它附带了一些示例)

    php artisan vendor:publish

并从提供的列表中选择 RonAppleton/MenuBuilder。

示例用法

要立即使用,您的配置文件夹中的 menu-builder.php 配置文件中已经定义了一个示例菜单。

该示例菜单称为 example-sidebar,要将此菜单添加到视图并查看 MenuBuilder 的操作,只需将您的视图之一添加到 menu-builder.php 配置文件中的 views 数组中,然后在视图中添加

    @each('menu-builder::partials.menu-item',
    $menuBuilder->menu('sidebar'), 'item',
    ['menuBuilder' => $menuBuilder])

即可。

功能

MenuBuilder 在原始工作基础上进行了大量扩展。除了项目过滤器外,现在还可以在将数据返回到视图之前对菜单本身运行过滤器。

您可以

  1. 创建标题
  2. 创建菜单条目
  3. 创建下拉菜单
  4. 添加图标
  5. 添加徽章
  6. 设置默认菜单文本颜色
  7. 设置菜单标题、条目和下拉菜单文本颜色
  8. 基于权限控制菜单项可见性
  9. 指定路由或 URL,并将其转换为 Laravel
  10. 在模块服务提供者中定义菜单
  11. 在配置文件中定义菜单
  12. 使用 Trait 允许在任何地方定义菜单
  13. 从模型中获取徽章值
  14. 使用多个条件控制徽章颜色
  15. 添加自定义过滤器以扩展功能
  16. 使用 12 个预设优先级来控制菜单项定位
  17. 做更多...
  18. 期待更多...

MenuBuilder 已经重新思考,以提供更多控制,并且它还可以走得更远。

定义菜单

如前所述,目前有两种方法可以定义菜单,在 MenuBuilder 的配置文件中和在您的模块服务提供者中。

首先,我们将查看定义两种方法中菜单的结构。

'example-menu-default-text-color' => 'secondary',
'example-menu' => [
    [
        'header' => 'Communication',
        'priority' => 'high'
    ],
    [
        'priority' => 'high',
        'text' => 'Messages',
        'icon' => 'commenting-o',
        'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
        'badge_method' => 'unreadMessages',
        'badge_conditions' => [
            [
                'condition' => '===',
                'value' => 0,
                'color' => 'success',
            ],
            [
                'condition' => '<',
                'value' => 0,
                'color' => 'info',
            ],
            [
                'condition' => '>',
                'value' => 20,
                'color' => 'warning',
            ],
            [
                'condition' => '>',
                'value' => 100,
                'color' => 'warning',
            ],
            'true_color' => 'success',
            'false_color' => 'danger',
        ]
    ],
    [
        'priority' => 'high',
        'text' => 'Email',
        'icon' => 'envelope-o',
        'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
        'badge_method' => 'unreadEmails',
        'badge_conditions' => [
            [
                'condition' => '===',
                'value' => 0,
                'color' => 'success',
            ],
            [
                'condition' => '>',
                'value' => 0,
                'color' => 'info',
            ],
            'true_color' => 'success',
            'false_color' => 'danger',
        ]
    ],
    [
        'priority' => 'high',
        'text' => 'Users',
        'url' => 'admin/pages',
        'icon' => 'users',
        'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
        'badge_method' => 'totalUsers',
        'badge_pill',
        'badge_color' => 'success',
    ],
    [
        'header' => 'Account Settings',
    ],
    [
        'text' => 'Profile',
        'url' => 'admin/settings',
        'icon' => 'user',
    ],
    [
        'text' => 'Change Password',
        'url' => 'admin/settings',
        'icon' => 'lock',
    ],
    [
        'header' => 'Configuration',
    ],
    [
        'text' => 'General',
        'icon' => 'tasks',
        'priority' => 'low',
        'submenu' => [
            [
                'text' => 'Level One',
                'dropped',
                'icon' => 'lock',
                'icon_color' => 'success',

                'url' => '#',
            ],
            [
                'text' => 'Level One',
                'dropped',
                'url' => '#',
            ],
            [
                'text' => 'Level One',
                'dropped',
                'url' => '#',
            ],
        ],
    ],
    [
        'text' => 'Editing',
        'icon' => 'pencil',
        'priority' => 'low',
        'submenu' => [
            [
                'text' => 'Level One',
                'dropped',
                'icon' => 'lock',
                'icon_color' => 'success',

                'url' => '#',
            ],
            [
                'text' => 'Level One',
                'dropped',
                'url' => '#',
            ],
            [
                'text' => 'Level One',
                'dropped',
                'url' => '#',
            ],
        ],
    ],
],

注意:上面示例中的第一个项目设置了菜单的默认文本颜色

    'example-menu-default-text-color' => 'secondary',

目前,这只能通过 MenuBuilder 配置文件来完成。

您可以通过阅读内容来查看可用于控制您的菜单的大部分选项,您还可以看到用于控制徽章的类的使用,这仅仅是您想要调用的过滤器(BadgeItemFilter)的完整命名空间和类名以及该类中的调用方法。

'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
'badge_method' => 'totalUsers',

上面示例中缺少的一点是使用 'can' 属性控制菜单项的可见性,这使用 Laravel 的 gate 来查看当前用户是否具有指定的权限,如果不具有,则隐藏菜单选项。

注意:MenuBuilder 在任何方面都不会阻止访问,它只是阻止用户在菜单中看到选项。

模块服务提供者(以及应用程序提供者)

MenuBuilder 现在有一个名为 AddsMenu 的 Trait,允许服务提供者创建菜单,只需添加类,并添加对

use Illuminate\Contracts\Events\Dispatcher;

的使用声明,并在 boot 方法中添加 Dispatcher 并调用

$this->menuListener($events);

并且您的服务提供商现在已准备好提供菜单。

当接收到建筑菜单事件时,将传递正在请求的菜单名称,以便您的提供商知道正在构建哪个菜单。

注意:您的菜单名称在服务提供商中必须使用驼峰式命名法才能被找到,但如果从配置中调用菜单,可以使用snake_casing等命名法,建议两种情况都使用驼峰式命名法以避免混淆。

要在您的提供商中定义菜单,只需在具有菜单名称的方法前加上单词menu。例如,如果您的菜单名称是

SidebarMenu

那么您的服务提供商中提供该菜单的方法应称为

menuSidebarMenu()

此方法应返回一个数组数组。要使用您的提供商构建上述菜单,请使用

private function menuSideBar() {
    return [
        [
            'header' => 'Communication',
            'priority' => 'high'
        ],
        [
            'priority' => 'high',
            'text' => 'Messages',
            'icon' => 'commenting-o',
            'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
            'badge_method' => 'unreadMessages',
            'badge_conditions' => [
                [
                    'condition' => '===',
                    'value' => 0,
                    'color' => 'success',
                ],
                [
                    'condition' => '<',
                    'value' => 0,
                    'color' => 'info',
                ],
                [
                    'condition' => '>',
                    'value' => 20,
                    'color' => 'warning',
                ],
                [
                    'condition' => '>',
                    'value' => 100,
                    'color' => 'warning',
                ],
                'true_color' => 'success',
                'false_color' => 'danger',
            ]
        ],
        [
            'priority' => 'high',
            'text' => 'Email',
            'icon' => 'envelope-o',
            'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
            'badge_method' => 'unreadEmails',
            'badge_conditions' => [
                [
                    'condition' => '===',
                    'value' => 0,
                    'color' => 'success',
                ],
                [
                    'condition' => '>',
                    'value' => 0,
                    'color' => 'info',
                ],
                'true_color' => 'success',
                'false_color' => 'danger',
            ]
        ],
        [
            'priority' => 'high',
            'text' => 'Users',
            'url' => 'admin/pages',
            'icon' => 'users',
            'badge_model' => 'RonAppleton\MenuBuilder\Models\BadgeExample',
            'badge_method' => 'totalUsers',
            'badge_pill',
            'badge_color' => 'success',
        ],
        [
            'header' => 'Account Settings',
        ],
        [
            'text' => 'Profile',
            'url' => 'admin/settings',
            'icon' => 'user',
        ],
        [
            'text' => 'Change Password',
            'url' => 'admin/settings',
            'icon' => 'lock',
        ],
        [
            'header' => 'Configuration',
        ],
        [
            'text' => 'General',
            'icon' => 'tasks',
            'priority' => 'low',
            'submenu' => [
                [
                    'text' => 'Level One',
                    'dropped',
                    'icon' => 'lock',
                    'icon_color' => 'success',

                    'url' => '#',
                ],
                [
                    'text' => 'Level One',
                    'dropped',
                    'url' => '#',
                ],
                [
                    'text' => 'Level One',
                    'dropped',
                    'url' => '#',
                ],
            ],
        ],
        [
            'text' => 'Editing',
            'icon' => 'pencil',
            'priority' => 'low',
            'submenu' => [
                [
                    'text' => 'Level One',
                    'dropped',
                    'icon' => 'lock',
                    'icon_color' => 'success',

                    'url' => '#',
                ],
                [
                    'text' => 'Level One',
                    'dropped',
                    'url' => '#',
                ],
                [
                    'text' => 'Level One',
                    'dropped',
                    'url' => '#',
                ],
            ],
        ],
    ];
}

现在,当调用SidebarMenu视图时,服务提供商将使用Trait监听到事件,并为您返回正确的菜单。

注意:如果菜单在服务提供商和配置文件中定义,将发生重复。如果菜单在您自己的模块服务提供商中,不要将其添加到配置文件中,但可以通过优先级在提供程序中定义,并在配置文件中添加额外条目,并使用优先级确保菜单正确显示,从而允许您根据您正在工作的应用程序定制菜单,而无需修改模块代码。