red-freak / laravel-menu
一个用于生成菜单的Laravel Facade。
0.0.1-alpha
2023-10-06 10:53 UTC
Requires
- php: ^8.0
Requires (Dev)
- orchestra/testbench: ^6.23 || ^7.0 || ^8.0
- pestphp/pest: ^1.20
- pestphp/pest-plugin-laravel: ^1.4
This package is auto-updated.
Last update: 2024-09-06 12:50:03 UTC
README
Laravel Menu 是一个用于为 Laravel 应用创建菜单的包。它也是一个用于解决基于模块的应用程序问题的包(参见 red-freak/laravel-modules)。
安装
通过 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 提供的关于包开发和它们的工作流程的一般灵感。