vynatu / menu
为 Laravel 提供的扩展性和异步菜单包
Requires
- php: >=7.0
- illuminate/support: ^5.0
This package is not auto-updated.
Last update: 2024-09-29 02:18:40 UTC
README
API 文档在这里:这里
简介
这是一个菜单库,与其他库的不同之处在于:
- 它是懒加载的
- 任何菜单都是可扩展的
- 它不会在中间件中加载
- 每个菜单声明都在其自己的类中
这种结构非常适合通过使用 Laravel 框架支持的不同的模块库来模块化和扩展菜单。
安装
Vynatu/Menu 只使用一个 service provider。
首先,使用 composer 安装
composer require vynatu/menu
然后,将服务提供者添加到 app.php
<?php 'providers' => [ ... Vynatu\Menu\MenuServiceProvider::class, ]
Vynatu/Menu 不需要别名。您可以直接使用 app('menu') 调用菜单管理器。
创建菜单
设置服务提供者
您可以在任何使用的服务提供者中注册菜单,但我更喜欢创建一个新的服务提供者,名为 MenuServiceProvider。
这允许您更好地分离 AppServiceProvider 所做的和仅用于注册和扩展菜单的新 MenuServiceProvider。
创建一个新的服务提供者(使用 Artisan)
artisan make:provider MenuServiceProvider
别忘了在 providers 中注册它!
<?php 'providers' => [ ... App\Providers\MenuServiceProvider::class, ]
创建新菜单
Vynatu/Menu 随附一个控制台命令,可以轻松创建菜单类。
artisan make:menu MainMenu
我们建议您将菜单放在子文件夹中(app/Menus)。
或者,您可以自己创建类
<?php namespace App\Menus; use Vynatu\Menu\MenuInstance; class AdminMainMenu extends MenuInstance { public function generate() { // } }
创建您的菜单类后,一个
\Vynatu\Menu\RootMenuItem的实例将自动注入到您的MenuInstance中。
向菜单添加项目
您可以通过使用 $this->menu 实例向菜单添加项目。
<?php function generate() { $this->menu->add('Dashboard')->url('/home'); // Method 1 $this->menu->add('My Account', '/'); // Method 2 $this->menu->add('List Users', 'route:users.list'); // Method 3 $this->menu->add('Seperator')->section(); // Method 4 $this->menu->add('Edit Myself', 'route:users.edit|id:5'); // Method 5 $this->menu->add('Logout')->route('auth.logout'); // Method 6 $this->menu->add('Some Other Link', ['url' => '/link']); // Method 7 }
注册菜单
在您之前创建的菜单服务提供者中,向 boot 方法添加以下内容
<?php function boot(\Vynatu\Menu\MenuManager $menu) { $menu->register('main_menu', \App\Menus\MainMenu::class); }
您不必使用依赖注入。您可以使用
app('menu')->register(...)代替。
扩展菜单
按照创建和注册菜单的相同步骤进行操作,但不是使用 register 方法
<?php function boot(\Vynatu\Menu\MenuManager $menu) { $menu->extend('main_menu', \App\Menus\MainMenuExtender::class); }
在菜单实例中访问菜单项
这样就可以访问菜单实例中的任何菜单项
<?php public function generate() { $this->menu->management->add(...); }
当添加新的菜单项时,会自动创建 management 变量。使用 snake_case 创建变量名称。
这意味着如果您创建了一个如 $this->menu->add('Management') 的项目,将存在一个名为 management 的新变量,并且可以通过本地菜单实例或任何菜单扩展器访问它。
如果您使用 _t 创建菜单名称(这意味着 slug 名称将始终更改),您可以静态设置 slug 名称
<?php public function generate() { $this->menu->add(_t('menus.management'))->route('admin.management')->slug('management'); }
这允许您的其他扩展器访问 management 菜单项,例如,更改其图标
<?php public function generate() { $this->menu->management->icon('fa fa-home'); }
为菜单项设置变量
有两种方法可以做到这一点。
第一种,使用一个 function。这对于保留 fluent API 很有用
<?php public function generate() { $this->menu->management->icon('fa fa-home'); }
第二种,使用 直接变量分配
<?php public function generate() { $this->menu->management->icon = 'fa fa-home'; }
在扩展器中可以更改一切,包括路由和 URL。
视图
在视图中迭代项目
以下是一个使用 bootstrap navbar 的示例:
文件名:menus.main_menu
<nav class="navbar navbar-default"> <div class="container-fluid"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false" aria-controls="navbar"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">Some Menu Example</a> </div> <div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav"> @include('menu::bootstrap.default', ['menu' => $menu]) </ul> </div><!--/.nav-collapse --> </div><!--/.container-fluid --> </nav>
文件名:menu_elements (也可在 view('menu::bootstrap.default') 下找到)
@foreach($menu->items() as $item) @if($item->hasSubItems()) <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ $item->title }}<span class="caret"></span></a> <ul class="dropdown-menu"> @include('menu_elements', ['menu' => $item]) </ul> </li> @else <li @if($item->active()) class="active" @endif> <a href="{{ $item->url }}">{{ $item->title }}</a> </li> @endif @endforeach
这将实现一个类似于 默认的Bootstrap导航栏 的菜单
技巧
- 您的菜单类的
__construct方法支持依赖注入。只需在参数列表中添加所需的类型提示,Laravel 将会自动注入所需的依赖。