spatie/laravel-menu
Build HTML menus in Laravel with a fluent API. Generate links via routes/actions/URLs, add classes and attributes, mark active items from the current request, and define reusable menu macros. Easy to render in Blade and customize output.
Fluent API Alignment: The package’s fluent interface (Menu::new()->action()->setActiveFromRequest()) aligns well with Laravel’s builder pattern (e.g., Eloquent queries, Form requests). This reduces cognitive load for developers already familiar with Laravel’s syntax.
Separation of Concerns: Menu logic is decoupled from Blade templates, enabling reusable menu definitions (e.g., Menu::macro('admin', ...)) and dynamic generation (e.g., fetching from a database).
Laravel Ecosystem Integration:
route(), action()) and authorization (addIfCan()).{!! Menu::main() !!}) and facades (Menu::macro()), fitting seamlessly into Laravel’s service container.Extensibility: The package allows custom menu items (e.g., Blade views, JavaScript links) and macros, enabling teams to extend functionality without forking the package.
composer require spatie/laravel-menu), with minimal configuration (no publishers, migrations, or service provider bindings required).spatie/menu (v3+) and Laravel’s core components, avoiding bloated dependencies. No database or external service requirements.{!! !!}) may require sanitization checks if menus include user-generated content (though the package itself doesn’t introduce XSS risks).addIfCan)?Gate and Policy classes (e.g., Menu::addIfCan()).route() and action() helpers for URL generation.Cache::remember()).spatie/menu package with a custom renderer.// app/Providers/AppServiceProvider.php
use Spatie\Menu\Laravel\Facades\Menu;
public function boot()
{
Menu::macro('footer', function () {
return Menu::new()
->action('HomeController@index', 'Home')
->action('ContactController@index', 'Contact')
->url('https://example.com/privacy', 'Privacy Policy');
});
}
<!-- Before: Hardcoded HTML -->
<nav>{!! $footerMenu !!}</nav>
<!-- After: Dynamic menu -->
<nav>{!! Menu::footer() !!}</nav>
Menu::macro() definitions.addIfCan, setActiveFromRequest).if (app()->bound('old.menu'))) for smooth transitions.spatie/menu is a lightweight dependency.composer require spatie/laravel-menu
config/menu.php required; package is zero-config.AppServiceProvider).AppServiceProvider), reducing scattered logic.composer update spatie/laravel-menu (low effort).How can I help you explore Laravel packages today?