The spatie/menu
package provides a fluent interface to build menus of any size in your php application. If you're building your app with Laravel, the spatie/laravel-menu
provides some extra treats.
##Human Readable, Fluent Interface
All classes provide a human readable, fluent interface (no array configuration). Additionally, you can opt for a more verbose and flexible syntax, or for convenience methods that cover most use cases.
Menu::new()
->add(Link::to('/', 'Home'))
->add(Link::to('/about', 'About'))
->add(Link::to('/contact', 'Contact'))
->render();
Menu::new()
->link('/', 'Home')
->link('/about', 'About')
->link('/contact', 'Contact');
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
##Strong Control Over the Html Output
You can programatically add html classes and attributes to any item in the menu, or to the menu itself.
Menu::new()
->addClass('navigation')
->add(Link::to('/', 'Home')->addClass('home-link'))
->add(Link::to('/about', 'About'))
->add(Link::to('/contact', 'Contact')->addParentClass('float-right'))
->wrap('div', ['class' => 'wrapper'])
<div class="wrapper">
<ul class="navigation">
<li><a href="/" class="home-link">Home</a></li>
<li><a href="/about">About</a></li>
<li class="float-right"><a href="/contact">Contact</a></li>
</ul>
</div
##Adding an ID to elements
You can add id, so you can easily target some of these elements with CSS or JS.
Menu::new()
->id('navigation')
->add(Link::to('/', 'Home')->id('home-link'))
->add(Link::to('/about', 'About'))
->add(Link::to('/contact', 'Contact'))
<ul id="navigation">
<li><a href="/" id="home-link">Home</a></li>
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
##Not Afraid of Depths
The menu supports submenus, which in turn can be nested infinitely.
Menu::new()
->add(Link::to('/', 'Home'))
->submenu('More', Menu::new()
->addClass('submenu')
->link('/about', 'About')
->link('/contact', 'Contact')
);
<ul>
<li><a href="/">Home</a></li>
<li>
More
<ul class="submenu">
<li><a href="/about">About</a></li>
<li><a href="/contact">Contact</a></li>
</ul>
</li>
</ul>
The Laravel version of the menu package adds some extras like convenience methods for generating URLs and macros.
Menu::macro('main', function () {
return Menu::new()
->action('HomeController@index', 'Home')
->action('AboutController@index', 'About')
->action('ContactController@index', 'Contact')
->setActiveFromRequest();
});
<nav class="navigation">
{!! Menu::main() !!}
</nav>
##We have badges!