cvepdb/ laravel-menus
Requires
- php: >=5.5.9
- illuminate/config: 5.3.*
- illuminate/support: 5.3.*
- illuminate/view: 5.3.*
- laravelcollective/html: ~5.0
Requires (Dev)
- laravel/framework: 5.3.*
- phpunit/phpunit: 4.6.*
README
官方文档位于此处
安装
您可以通过Composer命令行安装。
composer require pingpong/menus
安装包后,将新的服务提供者添加到config/app.php文件中的providers数组。
'providers' => array(
'Pingpong\Menus\MenusServiceProvider'
),
在同一文件中,为Menu外观添加新的别名到aliases数组。
'aliases' => array(
'Menu' => 'Pingpong\Menus\MenuFacade',
)
然后,通过运行以下命令发布包的资产:
php artisan vendor:publish
创建菜单
您可以在app/Support/menus.php文件中定义您的菜单。该文件将自动由此包加载。要创建菜单,只需从Menu外观调用create方法。第一个参数是菜单名称,第二个参数是定义菜单项的回调函数。
Menu::create('navbar', function($menu)
{
// define your menu items here
});
自2.1.1版本起,您也可以通过make方法创建菜单。
Menu::make('navbar', function($menu)
{
// define your menu items here
});
菜单项 如前所述,我们可以在回调函数中通过访问菜单变量来定义菜单项,该变量是Pingpong\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' => 'gravitano']],
'title' => 'Visit My Profile',
'attributes' => [
'target' => '_blank'
]
]);
});
菜单下拉菜单 要创建下拉菜单,您可以调用->dropdown()方法,并通过第一个参数传递下拉菜单的标题,通过闭包回调函数传递第二个参数以检索$sub变量。$sub变量是Pingpong\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');
});
});
您可以通过指定顺序参数来对菜单项进行排序。
Menu::create('navbar', function($menu)
{
// url, title, order, attributes
$menu->url('/', 'Home', 1);
// url, title, route parameters, order, attributes
$menu->route('/', 'About', ['user' => '1'], 2);
// title, order, callback attributes
$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);
});
默认情况下,排序功能是禁用的。您可以在您的配置文件中启用排序功能。只需将排序配置值更新为true,现在您的菜单将按顺序键排序。// 文件:config/menus.php
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');
});
Menu Presenter
此包包含一些用于将菜单转换为HTML标签的表示类。默认生成的菜单样式是Bootstrap导航栏。但是,也有几种不同的菜单样式。您可以通过->style()方法应用菜单样式。
Menu::create('navbar', function($menu)
{
$menu->style('nav-pills');
});
或者,您可以通过->setPresenter()方法设置要呈现的菜单样式。
Menu::create('navbar', function($menu)
{
$menu->setPresenter('Pingpong\Menus\Presenters\Bootstrap\NavTabPresenter');
});
在渲染菜单时,您也可以设置表示者的样式。
Menu::render('navbar', 'navbar-right');
Menu::render('navbar', 'Pingpong\Menus\Presenters\Bootstrap\NavPillsPresenter');
可用的菜单表示类列表
Name Presenter Class
navbar Pingpong\Menus\Presenters\Bootstrap\NavbarPresenter
navbar-right Pingpong\Menus\Presenters\Bootstrap\NavbarRightPresenter
nav-pills Pingpong\Menus\Presenters\Bootstrap\NavPillsPresenter
nav-tab Pingpong\Menus\Presenters\Bootstrap\NavTabPresenter
sidebar Pingpong\Menus\Presenters\Bootstrap\SidebarMenuPresenter
navmenu Pingpong\Menus\Presenters\Bootstrap\NavMenuPresenter
创建自定义表示者
您可以使用自己的展示类。确保您的展示类继承自 Pingpong\Menus\Presenters\Presenter 并实现 'Pingpong\Menus\Presenters\PresenterInterface' 接口。例如,这是 zurb-top-bar 展示类。
use Pingpong\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 array(
'navbar' => 'Pingpong\Menus\Presenters\Bootstrap\NavbarPresenter',
'navbar-right' => 'Pingpong\Menus\Presenters\Bootstrap\NavbarRightPresenter',
'nav-pills' => 'Pingpong\Menus\Presenters\Bootstrap\NavPillsPresenter',
'nav-tab' => 'Pingpong\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');
});
可用的视图展示类列表
View Name Menu Style
menus::default Bootstrap Navbar (default)
menus::navbar-left Bootstrap Navbar Left
menus::navbar-right Bootstrap Navbar Right
menus::nav-tabs Bootstrap Nav Tabs
menus::nav-tabs-justified Bootstrap Nav Tabs Justified
menus::nav-pills Bootstrap Nav Pills
menus::nav-pills-stacked Bootstrap Nav Pills Stacked
menus::nav-pills-justified Bootstrap Nav Pills Justified
menus::menu Plain Menu
Rendering Menu
要渲染菜单,可以使用 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');
// 再次向菜单中添加项
$menu->add(['title' => 'Settings', 'route' => 'settings']);
$menu->url('profile', 'Profile');
$menu->route('settings', 'Settings');
查找菜单项
要查找菜单项,可以使用 Pingpong\Menus\MenuBuilder 类中的 findBy 方法。
$menu = Menu::instance('sidebar');
$menu->url('profile', 'Profile');
$menuItem = $menu->findBy('title', 'Profile');
// 添加子菜单
$menuItem->url('foo', 'Foo');
您还可以使用 whereTitle 辅助方法来查找特定的菜单项。您还可以在 whereTitle 方法第二个参数的位置的回调中添加其他子菜单项。
$menu = Menu::instance('sidebar');
$menu->url('profile', 'Profile');
$menu->whereTitle('Profile', function ($sub)
{
$sub->url('foo', 'Foo');
});
// 添加子菜单 修改菜单
创建菜单后,我们可能需要添加其他附加菜单。您可以通过 ->modify 方法修改菜单。
Menu::modify('navbar', function($menu)
{
$menu->add([
'title' => 'Foo',
'url' => 'bar',
]);
});