sagsoz06 / laravel-menus
Laravel 菜单管理
Requires
- php: >=5.5.9
- illuminate/config: 5.2.*|5.3.*|5.4.*
- illuminate/support: 5.2.*|5.3.*|5.4.*
- illuminate/view: 5.2.*|5.3.*|5.4.*
- laravelcollective/html: 5.2.*|5.3.*|5.4.*
Requires (Dev)
- friendsofphp/php-cs-fixer: ^1.11
- mockery/mockery: ~0.9
- orchestra/testbench: 3.2.*| 3.3.*|3.4.*
- phpro/grumphp: ^0.9.1
- phpunit/phpunit: ~5.7
README
Laravel Menus
nwidart/laravel-menus
是一个用于管理菜单的 Laravel 扩展包。它具有一个名为 presenters 的功能,该功能可以轻松地进行菜单渲染的样式定制和自定义结构。
此包是已重新发布、重新组织和维护的版本 pingpong/menus,该版本已不再维护。此包被用于 AsgardCMS。
一个原始包没有的大优点: 测试。
安装
您可以通过 composer 命令行安装它。
composer require nwidart/laravel-menus
安装包后,将新服务提供者添加到 config/app.php
文件中的 providers
数组中。
'providers' => [ Nwidart\Menus\MenusServiceProvider::class, ],
在同一文件中,将新的 Menu
门面别名添加到 aliases
数组中。
'aliases' => array( 'Menu' => Nwidart\Menus\Facades\Menu::class, )
然后,通过运行以下命令发布包的资产
php artisan vendor:publish --provider="Nwidart\Menus\MenusServiceProvider"
创建菜单
您可以在 app/Support/menus.php
文件中定义您的菜单。该文件将由该包自动加载。
要创建菜单,只需从 Menu
门面调用 create
方法。第一个参数是菜单名称,第二个参数是用于定义菜单项的回调函数。
Menu::create('navbar', function($menu) { // define your menu items here });
菜单项
如前所述,我们可以在回调函数中通过访问 $menu
变量来定义菜单项,该变量是 Nwidart\Menus\MenuBuilder
类的实例。
要定义一个普通 URL,可以使用 ->url()
方法。
Menu::create('navbar', function($menu) { // URL, Title, Attributes $menu->url('home', 'Home', ['target' => 'blank']); });
如果您有命名路由,您可以通过调用 ->route()
方法来定义菜单项。
Menu::create('navbar', function($menu) { $menu->route( 'users.show', // route name 'View Profile', // title ['id' => 1], // route parameters ['target' => 'blank'] // attributes ); });
您也可以通过调用 ->add()
方法通过数组定义菜单项。
Menu::create('navbar', function($menu) { $menu->add([ 'url' => 'about', 'title' => 'About', 'attributes' => [ 'target' => '_blank' ] ]); $menu->add([ 'route' => ['profile', ['user' => 'nwidart']], 'title' => 'Visit My Profile', 'attributes' => [ 'target' => '_blank' ] ]); });
菜单下拉
要创建下拉菜单,您可以调用 ->dropdown()
方法并将第一个参数传递为下拉菜单的标题,第二个参数传递为闭包回调,该回调检索 $sub
变量。变量 $sub
是 Nwidart\Menus\MenuItem
类的实例。
Menu::create('navbar', function($menu) {
$menu->url('/', 'Home');
$menu->dropdown('Settings', function ($sub) {
$sub->url('settings/account', 'Account');
$sub->url('settings/password', 'Password');
$sub->url('settings/design', 'Design');
});
});
菜单多级下拉
您还可以通过使用 ->dropdown()
方法在下拉菜单内创建下拉菜单。这将允许您创建多级菜单项。
Menu::create('navbar', function($menu) {
$menu->url('/', 'Home');
$menu->dropdown('Account', function ($sub) {
$sub->url('profile', 'Visit My Profile');
$sub->dropdown('Settings', function ($sub) {
$sub->url('settings/account', 'Account');
$sub->url('settings/password', 'Password');
$sub->url('settings/design', 'Design');
});
$sub->url('logout', 'Logout');
});
});
菜单分隔符
您还可以为每个菜单项定义分隔符。您可以使用 ->divider()
方法在菜单项之间进行分隔。
Menu::create('navbar', function($menu) { $menu->url('/', 'Home'); $menu->divider(); $menu->url('profile', 'Profile') });
下拉菜单标题
您还可以通过使用 ->header()
方法为指定的菜单项添加下拉菜单标题。
Menu::create('navbar', function($menu) { $menu->url('/', 'Home') $menu->dropdown('Settings', function ($sub) { $sub->header('ACCOUNT'); $sub->url('/settings/design', 'Design'); $sub->divider(); $sub->url('logout', 'Logout'); }); });
菜单项排序
您可以通过指定 order
参数来对菜单进行排序。
Menu::create('navbar', function($menu) { $menu->url('/', 'Home', 1); $menu->route('/', 'About', ['user' => '1'], 2); $menu->dropdown('Settings', function ($sub) { $sub->header('ACCOUNT'); $sub->url('/settings/design', 'Design'); $sub->divider(); $sub->url('logout', 'Logout'); }, 3); });
您还可以通过调用 ->order
方法来设置排序值。
Menu::create('navbar', function($menu) { $menu->url('/', 'Home', ['icon' => 'fa fa-dashboard'])->order(1); $menu->route('/', 'About', ['user' => '1'], ['icon' => 'fa fa-user'])->order(2); $menu->dropdown('Settings', function ($sub) { $sub->header('ACCOUNT'); $sub->url('/settings/design', 'Design'); $sub->divider(); $sub->url('logout', 'Logout'); })->order(3); });
默认情况下,排序功能是禁用的。您可以在配置文件中启用 ordering
功能。只需将 ordering
配置值更新为 true
,现在您的菜单将按 order
键排序。
return [ 'ordering' => true ];
您还可以通过调用 ->enableOrdering
和 ->disableOrdering
方法为每个菜单启用或禁用排序。
Menu::create('navbar', function($menu) { // disable menu ordering $menu->enableOrdering(); // disable menu ordering $menu->disableOrdering(); });
创建多个菜单
您还可以创建具有不同名称和菜单项的一组菜单。
Menu::create('menu1', function($menu) { $menu->route('home', 'Home'); $menu->url('profile', 'Profile'); }); Menu::create('menu2', function($menu) { $menu->route('home', 'Home'); $menu->url('profile', 'Profile'); });
菜单展示器
本包包含一些用于将菜单转换为HTML的展示类。默认生成的菜单样式为bootstrap navbar
。但,还有几种不同的菜单样式。
您可以通过->style()
方法应用菜单样式。
Menu::create('navbar', function($menu) { $menu->style('nav-pills'); });
或者您可以通过->setPresenter()
方法设置哪个展示类来呈现菜单样式。
Menu::create('navbar', function($menu) { $menu->setPresenter(\Nwidart\Menus\Presenters\Bootstrap\NavTabPresenter::class); });
在渲染菜单时,您也可以设置展示类的样式。
Menu::render('navbar', 'navbar-right'); Menu::render('navbar', \Nwidart\Menus\Presenters\Bootstrap\NavPillsPresenter::class);
可用菜单展示类列表
创建自定义展示类
您可以创建自己的展示类。确保您的展示类扩展了Nwidart\Menus\Presenters\Presenter
并实现了'Nwidart\Menus\Presenters\PresenterInterface'接口。
例如,这是zurb-top-bar
展示类。
use Nwidart\Menus\Presenters\Presenter; class ZurbTopBarPresenter extends Presenter { /** * {@inheritdoc } */ public function getOpenTagWrapper() { return PHP_EOL . '<section class="top-bar-section">' . PHP_EOL; } /** * {@inheritdoc } */ public function getCloseTagWrapper() { return PHP_EOL . '</section>' . PHP_EOL; } /** * {@inheritdoc } */ public function getMenuWithoutDropdownWrapper($item) { return '<li'.$this->getActiveState($item).'><a href="'. $item->getUrl() .'">'.$item->getIcon().' '.$item->title.'</a></li>'; } /** * {@inheritdoc } */ public function getActiveState($item) { return \Request::is($item->getRequest()) ? ' class="active"' : null; } /** * {@inheritdoc } */ public function getDividerWrapper() { return '<li class="divider"></li>'; } /** * {@inheritdoc } */ public function getMenuWithDropDownWrapper($item) { return '<li class="has-dropdown"> <a href="#"> '.$item->getIcon().' '.$item->title.' </a> <ul class="dropdown"> '.$this->getChildMenuItems($item).' </ul> </li>' . PHP_EOL; ; } }
要使用这个自定义展示类,您可以使用setPresenter
方法。
Menu::create('zurb-top-bar', function($menu) { $menu->setPresenter('ZurbTopBarPresenter'); });
注册新的菜单样式
菜单样式就像是一个展示类的别名。您可以在配置文件config/menus.php
中注册您的样式。
return [ 'navbar' => 'Nwidart\Menus\Presenters\Bootstrap\NavbarPresenter', 'navbar-right' => 'Nwidart\Menus\Presenters\Bootstrap\NavbarRightPresenter', 'nav-pills' => 'Nwidart\Menus\Presenters\Bootstrap\NavPillsPresenter', 'nav-tab' => 'Nwidart\Menus\Presenters\Bootstrap\NavTabPresenter', 'zurb-top-bar' => 'ZurbTopBarPresenter', ];
现在,您可以使用这样的样式。
Menu::create('zurb-top-bar', function($menu) { $menu->style('zurb-top-bar'); });
视图展示器
如果您不想使用展示类,您可以使用视图展示类。我们可以通过调用->setView()
方法设置哪个视图来展示菜单。
Menu::create('navbar', function($menu) {
$menu->setView('menus::default');
});
可用视图展示类列表
渲染菜单
要渲染菜单,您可以使用render
或get
方法。
Menu::render('navbar'); Menu::get('navbar');
您也可以在第二个参数中设置展示菜单的样式。
Menu::render('navbar', 'navbar-right');
或者您也可以设置展示菜单的视图。
Menu::render('navbar', 'menus::nav-tabs');
菜单实例
有时,我们可能需要在控制器或其他位置添加一个新菜单。要获取现有菜单的实例,您可以使用instance
方法。
$menu = Menu::instance('zurb-top-bar'); // You can also make additions to the menu again $menu->add(['title' => 'Settings', 'route' => 'settings']); $menu->url('profile', 'Profile'); $menu->route('settings', 'Settings');
查找菜单项
要查找菜单项,您可以使用来自Nwidart\Menus\MenuBuilder
类的findBy
方法。
$menu = Menu::instance('sidebar'); $menu->url('profile', 'Profile'); $menuItem = $menu->findBy('title', 'Profile'); // add child menu $menuItem->url('foo', 'Foo');
您也可以使用whereTitle
辅助方法来查找特定的菜单项。此外,您还可以在whereTitle
方法的第二个参数中定位的回调函数中添加其他子菜单项。
$menu = Menu::instance('sidebar'); $menu->url('profile', 'Profile'); $menu->whereTitle('Profile', function ($sub) { $sub->url('foo', 'Foo'); }); // add childs menu
修改菜单
在创建菜单后,我们可能需要添加其他附加菜单。您可以通过->modify
方法修改菜单。
Menu::modify('navbar', function($menu)
{
$menu->add([
'title' => 'Foo',
'url' => 'bar',
]);
});