cvepdb/laravel-menus

该包已被废弃,不再维护。作者建议使用cvepdb/laravel-menus包。

Laravel Menus

2.3.1 2016-10-12 11:02 UTC

README

Build Status

官方文档位于此处

安装

您可以通过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',
    ]);
});