tlr / menu
从构建菜单(实际上任何列表,因为菜单本质上就是这样)中去除一些压力和样板代码。支持Laravel
Requires
- php: >=5.3.0
- illuminate/support: ~5.0
- laravelcollective/html: ~5.0
- patchwork/utf8: 1.1.*
Requires (Dev)
- mockery/mockery: dev-master
- phpunit/phpunit: ~4.0
README
尝试从构建菜单(实际上任何列表,因为菜单本质上就是这样)中去除一些压力和样板代码。支持Laravel 4(其他框架将随后支持)
框架集成
安装
按照如下方式要求库
composer require tlr/menu "2.*"
基本用法
为您的菜单创建一个新的MenuItem
类
$menu = new Tlr\Menu\MenuItem;
添加一些菜单项
$home = $menu->item( 'home', 'Home', 'http://foo.com' ); $blog = $menu->item( 'blog', 'Blog', 'http://foo.com/blog' ); $about = $menu->item( 'about', 'About', 'http://foo.com/about-us' );
为什么不添加一个子菜单?菜单及其所有项都是相同的MenuItem
类,因此创建子菜单与顶层菜单相同
$about->item( 'where-we-are', 'Where We Are', 'http://eric.com/where-are-we' ); $about->item( 'contact-us', 'Contact Us', 'http://eric.com/contact-us' );
然后,在您的视图中,您可以使用$menu->getItems()
方法遍历菜单的项。
您可以通过其键检索现有项
$blog = $menu->item('blog');
方法签名如下
$menu->item( $key[, $title = "", $options = array(), $attributes = array(), $index = $n + 100] )
$key
是一个用于检索项的字符串键。它也被添加到类属性中(以slugified形式)。这是唯一必需的参数。$title
是列表项中显示的文本$options
是项的选项数组。如果您传递一个字符串到第三个项,它将假设它是链接选项,并将其转换为array( 'link' => $string )
$attributes
是HTML元素的属性数组$index
是一个可选索引,用于插入新菜单项。默认情况下,索引为100的增量,从100开始,因此您可以在它们之间轻松插入项。
管理多个菜单
如果您有,例如,标题和页脚菜单,您可以使用MenuRepository类
$repo = new MenuRepository; $headerMenu = $repo->menu( 'header-nav' ); $footerMenu = $repo->menu( 'footer-nav' );
并且您可以在代码中通过相同的方式检索菜单
$headerMenu = $repo->menu( 'header-nav' ); // will use the existing menu instance cached with this key $newMenu = $repo->menu( 'other-nav' ); // that key hasn't been used yet, so a new instance will be created and cached with that key
过滤器
菜单可以被过滤。假设您有一个用于管理区域或具有用户认证级别或权限的上下文中的菜单。您有两个选项
- 您可以将一个过滤器闭包传递给
getItems
方法,该闭包将被用于过滤菜单项。
// This will filter the items based on user permissions $menu->getItems(function($item) use ($user) { return $user->can( $item->option( 'permissions', array() ) ); });
- 您可以使用
addFilter($callable)
方法向菜单添加多个过滤器。这些过滤器将在调用getItems
方法时应用。
// This will add a filter that only lets the given user see the menu items if they have the appropriate auth level $menu->addFilter(function($item) use ($user) { return $item->option('auth') <= $user->authLevel; }); $menu->getItems();
- 您不必过滤整个菜单 - 您也可以过滤子菜单
$about->addFilter(function() { return $item->isVisible(); });
- 默认情况下,通过
addFilter
添加的任何过滤器都应用于子菜单。您可以通过将第二个参数传递为false来覆盖此行为
$menu->addFilter(function($item) use ($user) { return $user->canSeePage( $item ); }, false);
- 如果您不想过滤项,您可以调用
$menu->getItems(false)
激活
要标记菜单项为活动状态,您有几个选项
假设您有一个这个2级菜单
$home = $menu->item( 'home', 'Home', 'http://foo.com' ); $blog = $menu->item( 'blog', 'Blog', 'http://foo.com/blog' ); $about = $menu->item( 'about', 'About', 'http://foo.com/about-us' ); $contact = $about->item( 'contact', 'Contact Us', 'http://foo.com/contact-us' ); $find = $about->item( 'find', 'Find Us', 'http://foo.com/find-us' );
手动激活
您可以使用setActive方法手动激活任何这些项
$blog->setActive();
URL匹配
对于更自动化的方法,您可以根据当前URL递归地标记其中之一为活动状态。例如
$menu->activate( $currentUrl );
这将匹配给定的url与菜单中的每个项,如果url匹配,则标记它们为活动状态。它还调用每个项的子项,如果它们有活动子项,则标记其父项为活动状态。即。活动状态会向上传播链。
因此,如果当前URL是 http://foo.com/contact-us
,这将标记 about
菜单项及其子项 contact
为活动状态。
高级
如果您想要基于与URL不同的内容进行匹配,您可以对MenuItem
的options
数组中的任何内容进行匹配
$home = $menu->item( 'home', 'Home', [ 'link' => 'http://foo.com', 'routename' => 'home' ] ); $blog = $menu->item( 'blog', 'Blog', [ 'link' => 'http://foo.com/blog', 'routename' => 'blog' ] ); $menu->activate( 'blog', 'routename' );
Laravel
将Tlr\Menu\Laravel\MenuServiceProvider
添加到Laravel的config/app.php
文件中的providers
数组,并将'Menu' => 'Tlr\Menu\Laravel\MenuFacade'
添加到aliases
数组。
然后,您可以使用Menu
外观类作为MenuRepository
类的快捷方式,如下所示
$menu = Menu::menu( 'nav' ); $menu->item('Home')
之后,您可以使用Menu::menu( 'nav' )
再次访问它。
类的Laravel版本可以输出(这将调用render()
方法)。这将使用Laravel的blade模板系统渲染菜单。您有两种自定义选项
- 您可以覆盖菜单构建器的视图(运行
php artisan vendor:publish
,然后编辑那些文件)。 - 您可以将视图传递给父菜单,如下所示。此视图将具有作为
$menu
变量的MenuItem
对象
$menu->setView( 'my.menu.view' );