spatie/laravel-menu
Build HTML menus in Laravel with a fluent API. Generate links from routes/actions/URLs, group items, add attributes/classes, and automatically set the active item from the current request. Extensible via macros; renders to HTML ready for Blade.
Unified Navigation for Multi-Product Ecosystems: Standardizes menu structures across SaaS platforms, admin panels, or multi-tenant applications, reducing user onboarding friction and design inconsistencies. Aligns with design system principles by centralizing navigation logic in a maintainable, code-driven format (vs. scattered Blade templates). Critical for products with shared UI components (e.g., spatie/laravel-menu’s macros enable reusable menus like Menu::macro('globalHeader', ...) across microservices).
Accelerated Feature Velocity: Eliminates repetitive menu boilerplate (e.g., active state checks, route generation, or conditional rendering) to reduce development time by 50–70% for complex menus. Example: A dashboard with 20+ route-aware items transitions from manual Blade logic to a declarative macro (Menu::macro('dashboardSidebar', ...)), freeing engineers to focus on core features. Supports agile roadmaps by abstracting away low-value UI plumbing.
Build vs. Buy Decision: Justifies a low-risk, high-reward adoption by leveraging a mature package (980+ stars, MIT license, Laravel 13 support) with zero long-term maintenance overhead. Avoids reinventing the wheel for a solved problem, reducing technical debt and aligning with Spatie’s track record of Laravel-first solutions (e.g., spatie/laravel-permission). Ideal for teams prioritizing speed-to-market over customization.
Roadmap Enablers:
Link and View item implementations.Gate or Policy classes via actionIfCan() or addIfCan(), enabling role-based menus without custom logic.Menu::macro('languageSelector', fn() => ...)) or Blade translations.->class('dark-mode')) for consistent styling across themes.Adopt When:
setActiveFromRequest()).Look Elsewhere If:
For Executives:
"This package lets us build and update navigation menus 3x faster while ensuring consistency across our Laravel products. Instead of manually coding menus in Blade—where errors, duplication, and updates become a nightmare—we’ll use a reusable, macro-based system (e.g., Menu::macro('adminSidebar')) that auto-highlights active pages and integrates with our permission system. It’s a zero-maintenance upgrade (MIT-licensed, 980+ stars) that reduces dev time and aligns with our design system goals. For example, adding a new menu item to our dashboard now takes 5 minutes instead of an hour."
For Engineers:
*"Spatie’s laravel-menu gives us a fluent, Laravel-native way to define menus in code (not Blade) with built-in support for:
action(), route()) and active state (setActiveFromRequest()).Menu::macro('globalHeader')) and conditional logic (actionIfCan() for permissions).{!! Menu::main() !!}) with zero JavaScript overhead.
It’s lightweight, actively maintained, and drops into any Laravel 8+ app in 10 minutes. No more fighting with nested Blade if statements or hardcoded active classes—just clean, scalable navigation logic."*How can I help you explore Laravel packages today?