red-freak/laravel-menu

一个用于生成菜单的Laravel Facade。

资助包维护!
red-freak

安装: 2

依赖: 0

建议者: 0

安全: 0

星标: 1

关注者: 1

分支: 0

开放问题: 0

类型:

0.0.1-alpha 2023-10-06 10:53 UTC

This package is auto-updated.

Last update: 2024-09-06 12:50:03 UTC


README

Laravel Menu 是一个用于为 Laravel 应用创建菜单的包。它也是一个用于解决基于模块的应用程序问题的包(参见 red-freak/laravel-modules)。

Latest Version MIT Licensed run-tests Total Downloads Total Downloads

Supported PHP Version Supported Laravel Version

安装

通过 composer 简单安装此包。

composer require red-freak/laravel-menu

如何使用

基本用法

基本思路是通过 Menu Facade 来创建或添加项目。它可以从任何地方访问。因此,您可以使用不同的(例如基于模块的)ServiceProviders 来实现这一点。

Menu::add('home')
    ->add(new Item('Home', '/'))
    ->add(new Item('About', '/about'))
    ->add(new Item('Login', '/login'));
<ul class="menu menu-level-0">
  <li class="menu-item menu-level-1">
    <a href="/">Home</a>
  </li>
  <li class="menu-item menu-level-1">
    <a href="/about">About</a>
  </li>
  <li class="menu-item menu-level-1">
    <a href="/login">Login</a>
  </li>
</ul>

向菜单添加项目

您可以在配置文件中定义菜单,以供项目中的后续使用,也可以通过 Menu Facade 向菜单添加项目。当然,它可以与标签一起工作。

// define the menu anywhere to use translation keys as labels (or do it by config)
Menu::add('home', [
    RenderOptions::KEY_USE_LABELS_AS_TRANSLATION_KEYS => true
]);

...

// have the corresponding translation keys via files (or in this case via the `Translator`-Facade)
app()->translator->addLines([
    'menu.label.home' => 'Home',
    'menu.label.about' => 'About',
    'menu.label.login' => 'Login',
], 'en');

...

// Now you can add items via the `Item` class ...
Menu::get('home')
    ->add(new Item('menu.label.home', 'https://'))
    ->add(new Item('menu.label.about', 'https:///about'))
    ->add(new Item('menu.label.login', 'https:///login'));

// ... or add them via key-value ...
Menu::get('home')
    ->add([
        Menu::KEY_ITEM_LABEL => 'Home',
        Menu::KEY_ITEM_LINK => 'https://',
    ])
    ->add([
        Menu::KEY_ITEM_LABEL => 'About',
        Menu::KEY_ITEM_LINK => 'https:///about',
    ])
    ->add([
        Menu::KEY_ITEM_LABEL => 'Login',
        Menu::KEY_ITEM_LINK => 'https:///login',
    ]);

// ... or add them via routes ...
// Route::get('/', fn() => 'home')->name('home');
// Route::get('/about', fn() => 'about')->name('about');
// Route::get('/login', fn() => 'login')->name('login');
Menu::get('home')
    ->add([Menu::KEY_ITEM_ROUTE => 'home'])
    ->add([Menu::KEY_ITEM_ROUTE => 'about'])
    ->add([Menu::KEY_ITEM_ROUTE => 'login']);

如果您现在通过自动创建的宏调用 Menu::home(),您将得到以下结果

<ul class="menu menu-level-0">
  <li class="menu-item menu-level-1">
    <a href="https://">Home</a>
  </li>
  <li class="menu-item menu-level-1">
    <a href="https:///about">About</a>
  </li>
  <li class="menu-item menu-level-1">
    <a href="https:///login">Login</a>
  </li>
</ul>

为模型添加子菜单

// define the route and the translation keys
Route::resource('users', Controller::class);
app()->translator->addLines([
    'menu.label.users.index' => 'Users',
    'menu.label.users.create' => 'create User',
], 'en');
// define the menu and add a submenu by a model
Menu::add('home', [RenderOptions::KEY_USE_LABELS_AS_TRANSLATION_KEYS => true])->add([
    Menu::KEY_ITEM_MODEL => User::class,
]);

如果您现在通过自动创建的宏调用 Menu::home(),您将得到以下结果

<ul class="menu menu-level-0">
  <li class="sub-menu menu-item menu-level-1">
    Users
    <ul class="sub-menu menu-item menu-level-2">
      <li class="menu-item menu-level-3">
        <a href="https:///users">Users</a>
      </li>
      <li class="menu-item menu-level-3">
        <a href="https:///users/create">create User</a>
      </li>
    </ul>
  </li>
</ul>

运行测试

vendor/bin/pest --coverage-html ./tests/reports/pest

特别感谢

  • Spatie 提供的关于包开发和它们的工作流程的一般灵感。