blimundo/laravel-menu

Laravel 应用程序的菜单管理

2.0.0 2022-03-09 06:33 UTC

This package is auto-updated.

Last update: 2024-09-09 12:07:15 UTC


README

在 Laravel 中实现简单且无痛苦的菜单管理。此包不提供任何 UI,仅关注存储和显示菜单的功能。

由于使用了 spatie/laravel-translatable 包,项目可以支持不同语言的显示。

要求

此包需要 Laravel 8 或更高版本,PHP 8 或更高版本,以及支持 json 字段和 MySQL 兼容函数的数据库。

安装

您可以通过 composer 安装此包

composer require blimundo/laravel-menu

包将自动注册自身。

安装后,您可以通过运行迁移来创建菜单表

php artisan migrate

将 MenuGenerator 别名提供给应用程序。

示例

use Blimundo\Menu\Builder;

Builder::add('Home')->order(1)->icon('mdi mdi-home')->url('HomeController@show')->create();

Builder::add(['en'  =>  'Settings',  'pt'  =>  'Configurações'])
	->order(9)
	->icon('mdi mdi-cog')
	->items(function  ()  {
		Builder::add(['en'  =>  'Roles',  'pt'  =>  'Funções'])
		->order(1)
		->icon('mdi mdi-account-group')
		->url('role.index')
		->gates('can_view_roles')
		->create();

		Builder::add(['en'  =>  'Users',  'pt'  =>  'Utilizadores'])
		->order(2)
		->icon('mdi mdi-account')
		->url('user.index')
		->gates('can_view_users')
		->create();
	});

dd(MenuGenerator::generate());

/* Result:

array:2 [
  "Home" => array:5 [
    "icon" => "mdi mdi-home"
    "label" => "Home"
    "link" => "localhost:8000/home"
    "level" => 1
    "has_items" => false
  ]
  "Settings" => array:6 [
    "icon" => "mdi mdi-cog"
    "label" => "Settings"
    "link" => "#"
    "level" => 1
    "has_items" => true
    "items" => array:2 [
      "Roles" => array:5 [
        "icon" => "mdi mdi-account-group"
        "label" => "Roles"
        "link" => "localhost:8000/role"
        "level" => 2
        "has_items" => false
      ]
      "Users" => array:5 [
        "icon" => "mdi mdi-account"
        "label" => "Users"
        "link" => "localhost:8000/user"
        "level" => 2
        "has_items" => false
      ]
    ]
  ]
*/

将菜单持久化到数据库中

要创建并持久化菜单到数据库中,您可以使用 Builder 类。在下面的示例中,创建了两个菜单条目

use Blimundo\Menu\Builder;

Builder::add('Home')->create();
Builder::add('Help')->create();

翻译

要定义多种语言,只需将数组传递给 add() 方法,其中键是语言代码。包内部使用 spatie/laravel-translatable 来管理翻译。

Builder::add(['en' => 'Help', 'pt' => 'Ajuda'])->create();

URL

您有 3 种方式来生成 URL

  • 路由 URL(调用 Laravel route() 辅助函数 - 如果路由不存在,则运行时将引发异常)
  • 动作 URL(调用 Laravel action() 辅助函数 - 如果控制器或方法不存在,则运行时将引发异常)
  • 静态 URL
Builder::add('Google')->url('https://google.com')->create();
Builder::add('Add User')->route('users.create')->create();
Builder::add('Import User')->action('\App\Http\Controllers\UserController@import')->create();

图标

要将图标关联到菜单,只需调用 icon() 函数。

Builder::add('Help')->icon('mdi mdi-help')->create();

顺序

要设置项目顺序,只需调用 order() 函数。

Builder::add('Help')->order(2)->create();

具有相同顺序(或未定义顺序)的项目将根据当前语言按字母顺序排序。

权限

有时我们希望菜单仅在用户具有某些权限时显示。此包使这变得非常简单。只需使用权限名称调用 gates() 函数。当生成菜单时,包将测试权限,如果通过则包括菜单。

Builder::add('Add User')->gates('can_add_user')->create();

如果您需要测试多个权限,请传递一个列表。只有当所有权限都返回 true 时,菜单才会显示。

Builder::add('Add User')->gates('can_add_user', 'can_import_user')->create();

子菜单

要创建子菜单,请调用 items() 函数,并传递一个回调。回调内部创建的所有菜单都将与该菜单相关联。

Builder::add('Settings')->items(function  ()  {
	Builder::add('Roles')->create();
	Builder::add('Users')->create();
});

许可协议

Laravel 菜单是开源软件,采用 MIT 许可协议