vynatu/menu

为 Laravel 提供的扩展性和异步菜单包

1.0.5 2017-11-09 02:46 UTC

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 将会自动注入所需的依赖。