javaabu/menu-builder

该包最新版本(v1.3.0)没有提供许可证信息。

动态渲染管理面板侧边栏菜单

v1.3.0 2024-09-23 06:19 UTC

This package is auto-updated.

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


README

Latest Version on Packagist Test Status Code Coverage Badge Total Downloads

此Laravel包使您能够轻松设置和渲染应用程序不同部分的菜单。Menu Builder类高度可配置,允许您以灵活和可维护的方式定义菜单的结构和行为。

安装

您可以通过composer安装此包

composer require javaabu/menu-builder

使用方法

定义菜单

每个菜单都是由一个继承自Javaabu\MenuBuilder\Menu\Menu的类定义的。这些类必须定义menuItems()方法。

以下是一个示例菜单类

<?php

namespace App\Menus;

use Javaabu\MenuBuilder\Menu\Menu;
use Javaabu\MenuBuilder\Menu\MenuItem;

class AdminSidebar extends Menu implements IsMenu
{
    protected string $id = 'side-bar';
    protected string $icon_prefix = 'zmdi zmdi-';
    protected ?string $guard = 'web_admin';

    public function menuItems(): array
    {
        return [
            MenuItem::make(__('Dashboard'))
                    ->route('admin.home')
                    ->icon('zmdi-view-quilt'),
                    
            MenuItem::make(__('Users'))
                ->controller(\App\Http\Controllers\Admin\UsersController::class)
                ->can('viewAny', \App\Models\User::class)
                ->icon('zmdi-accounts')
                ->count(App\Models\User::userVisible()->pending(), 'approve_users'),

            MenuItem::make(__('Roles'))
                ->url('/roles?foo=bars')
                ->permissions('view_roles')
                ->active(function (Request $request) {
                    return $request->query('foo') == 'bars';
                })
                ->badge(__('New'), 'text-bg-primary'),
        ];
    }
}

$id是一个可选属性,您可以设置以给菜单分配一个id。$icon_prefix是一个可选属性,您可以设置以给所有菜单项的图标分配一个前缀。$guard是一个可选属性,您可以设置以指定用于查找当前用户的守卫。menuItems方法返回一个定义菜单项的数组。每个项都是通过MenuItem::make方法创建的。MenuItem::make方法接受菜单项的标签,并返回一个MenuItem实例。

您可以使用以下任何一种方法来设置菜单项的链接。链接将通过最后调用的方法生成

  • route - 使用route()辅助函数设置链接。将自动根据给定的路由确定活动状态。
  • controller - 使用给定控制器的index操作设置链接。如果当前控制器是给定的控制器,则活动状态为true。
  • url - 直接使用字符串设置链接。如果当前完整URL与给定的URL匹配,则活动状态为true。

当使用上述任何一种方法设置链接时,活动状态将自动确定。如果您想自定义活动状态逻辑,可以使用以下方法

  • active - 设置检查菜单项是否活动的条件。接受布尔值或闭包。
  • routePattern - 使用路由模式设置检查菜单项是否活动的条件。接受字符串或字符串数组或多个路由模式作为单独的参数。如果同时使用active选项和routePattern,则active将具有优先权。

您可以使用以下任何一种方法来设置条件以确定是否向当前用户显示项

  • permissions - 这定义了用户必须拥有的权限或权限数组才能看到菜单项。任何权限都足以查看菜单项。
  • can - 这定义了用户必须使用can辅助函数拥有的必要权限才能看到菜单项。此方法也接受闭包。

如果您同时调用permissionscan,则两种方法中定义的条件都应满足才能显示项

您可以使用以下方法进一步配置菜单项

  • badge - 向菜单项添加可选的徽章文本。也可以传递徽章类。
  • icon - 设置菜单项的图标
  • count - 设置菜单项的通知计数。此方法可以接受 int、闭包或甚至是一个优雅的 Builder 实例。您可以使用此方法的第二个参数指定显示计数所需的权限。
  • children - 设置菜单项的子项。请注意,默认视图仅支持 2 级菜单项。如果您想要更多级别或无限级别,您可以在渲染菜单时提供自己的视图。
  • hideIfNoChildrenVisible - 如果菜单项有子项但没有可见子项,则隐藏菜单项。默认情况下,此选项适用于空白链接的项。
  • dontHideIfNoChildrenVisible - 即使没有可见子项,也不要隐藏菜单项

显示菜单

定义菜单类后,您可以通过调用 links() 方法在视图文件中显示它。

以下是一个显示菜单的示例代码

$sidebar = new \App\Menus\AdminSidebar();

{!! $sidebar->links() !!}

显示菜单时,您可以使用以下方法进一步自定义菜单的显示方式: iconPrefix - 设置所有菜单项使用的图标前缀 guard - 设置用于查找当前用户的守卫 id - 设置菜单的 CSS ID

更改 CSS 框架

默认情况下,菜单将渲染为 Bootstrap 5 菜单。该包支持 Bootstrap 5 和 Material Admin 2.6 CSS 框架。要更改使用的框架,您可以调用以下任何方法

// render as Bootstrap 5
{!! $sidebar->useBootstrap5()->links() !!}

// render as Material Admin 2.6
{!! $sidebar->useMaterialAdmin26()->links() !!}

您还可以通过在 App\Providers\AppServiceProvider 类的 boot 方法中调用 MenuBuilderuseBootstrap5useMaterialAdmin26 方法来更改默认框架。

use Javaabu\MenuBuilder\MenuBuilder;
 
/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    MenuBuilder::useBootstrap5();
    MenuBuilder::useMaterialAdmin26();
}

自定义渲染的菜单

如果您想在自定义视图中渲染菜单,则 links 方法将接受您的视图。

// render using custom view
{!! $sidebar->links('web.menus.sidebar') !!}

视图将接收以下数据

  • $items - 当前用户可见的根级菜单项数组
  • $user - 当前用户
  • $icon_prefix - 用于项目图标的前缀
  • $id - 菜单的 CSS ID

以下方法将可用于菜单项

$item->getLink() // returns the link of the item
$item->getLabel() // returns the label of the item
$item->isActive() // checks if the item is currently active
$item->hasActiveChild($user) // checks if the item has any visible child that is currently active
$item->hasIcon() // checks if the item has an icon defined
$item->getIcon($icon_prefix) // returns the item's icon with the prefix prepended
$item->getAggregatedCount($user) // get the count of the item + the count of all visible child items, will return 0 if the current user can't see the count
$item->getVisibleCount($user) // get the count of the item, will return 0 if the current user can't see the count
$item->getVisibleChildren($user) // returns an array of all visible child items

如果您想自定义默认视图,可以发布包视图并对其进行自定义。要将视图文件发布到 resources/views/vendor/menu-builder,运行

php artisan vendor:publish --provider="Javaabu\MenuBuilder\MenuBuilderServiceProvider" --tag="menu-builder-views"

这个全面的 Laravel 包简化了创建自定义菜单的过程,同时提供了满足您独特需求的灵活性。

鸣谢

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件