ronappleton / menubuilder
Laravel 导航菜单构建器
Requires
- laravel/framework: 5.5.*
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 在原始工作基础上进行了大量扩展。除了项目过滤器外,现在还可以在将数据返回到视图之前对菜单本身运行过滤器。
您可以
- 创建标题
- 创建菜单条目
- 创建下拉菜单
- 添加图标
- 添加徽章
- 设置默认菜单文本颜色
- 设置菜单标题、条目和下拉菜单文本颜色
- 基于权限控制菜单项可见性
- 指定路由或 URL,并将其转换为 Laravel
- 在模块服务提供者中定义菜单
- 在配置文件中定义菜单
- 使用 Trait 允许在任何地方定义菜单
- 从模型中获取徽章值
- 使用多个条件控制徽章颜色
- 添加自定义过滤器以扩展功能
- 使用 12 个预设优先级来控制菜单项定位
- 做更多...
- 期待更多...
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监听到事件,并为您返回正确的菜单。
注意:如果菜单在服务提供商和配置文件中定义,将发生重复。如果菜单在您自己的模块服务提供商中,不要将其添加到配置文件中,但可以通过优先级在提供程序中定义,并在配置文件中添加额外条目,并使用优先级确保菜单正确显示,从而允许您根据您正在工作的应用程序定制菜单,而无需修改模块代码。