spatie/laravel-navigation
Define a navigation tree for Laravel apps and reuse it to build menus, breadcrumbs, and other nav UI. Manage sections, nested items, and active state in PHP, register navigation via service providers/container events, and render however you like.
route() helpers), Blade components, and service providers, reducing friction in adoption.config/navigation.php).@foreach loops.spatie/laravel-navigation.// Before: Hardcoded Blade
<ul>
<li><a href="{{ route('home') }}">Home</a></li>
<li><a href="{{ route('blog') }}">Blog</a></li>
</ul>
// After: Dynamic Navigation
@foreach(Navigation::make()->get() as $item)
<li><a href="{{ $item->url }}">{{ $item->name }}</a></li>
@endforeach
Route::get('/navigation', function () {
return Navigation::make()->get();
});
// Inertia.js example
const navigation = await axios.get('/navigation');
composer.json for exact range). Test compatibility with other packages (e.g., Spatie’s Laravel Menu if migrating).Cache::tags('navigation')->remember()) for dynamic menus.composer require spatie/laravel-navigation.php artisan vendor:publish --provider="Spatie\Navigation\NavigationServiceProvider".Navigation::make('main', fn () => [
'Home' => route('home'),
'Blog' => route('blog.index'),
]);
@foreach(Navigation::get('main') as $item).Navigation::get('main') as JSON.taper --profile).app/Navigation.php), reducing duplication.fn (Section $section) => $section->canSee(fn () => Auth::user()->isAdmin()).Route::getRoutes() cached at boot.Str::startsWith() for prefix matches if exact routes aren’t critical.fn () => TenantNavigation::for(Tenant::current()).| Failure Scenario | Impact | Mitigation
How can I help you explore Laravel packages today?