lunestudio/filament-navigation-manager
Installation
Run composer require lunestudio/filament-navigation-manager and execute php artisan filament-navigation-manager:install to publish migrations and assets.
Register Plugin
Add the plugin to your AdminPanelProvider:
public function panel(Panel $panel): Panel {
return $panel
->default()
->plugins([
FilamentNavigationManagerPlugin::make(),
]);
}
Publish Config
Run php artisan vendor:publish --tag="filament-navigation-manager-config" to customize settings like the model or labels.
Migrate & Seed
Run php artisan migrate and optionally seed default menus via php artisan db:seed --class=NavigationManagerSeeder (if provided).
First Menu Creation
Access the /admin/menus route (default) to create your first menu via the Filament UI. Use the built-in CRUD interface to define:
Create a top-level menu (e.g., "Dashboard") with child items like:
/admin/analytics)/admin/reports)Use the Visibility tab to restrict access to specific user roles (e.g., admin).
Menu Hierarchy Management
Dynamic Rendering
@foreach (\Lunestudio\FilamentNavigationManager\Facades\NavigationManager::getMenu('dashboard') as $item)
<a href="{{ $item->url }}">{{ $item->label }}</a>
@endforeach
Conditional Logic
// In your Menu model or policy
public function visibleTo(User $user): bool {
return $user->hasPermission('view_dashboard');
}
canAccessPanel() or custom logic to show/hide menus based on:
$user->isAdmin()).session('active_tab')).request()->routeIs('admin.*')).Integration with Filament Resources
NavigationItem::make()
->label('Users')
->url(fn () => Filament::getCurrentPanel()->getDashboardUrl())
->icon('heroicon-o-users')
Custom Menu Providers Extend functionality by creating a custom provider:
use Lunestudio\FilamentNavigationManager\Contracts\MenuProvider;
class CustomMenuProvider implements MenuProvider {
public function getMenus(): array {
return [
'api' => [
'label' => 'API Docs',
'url' => 'https://docs.example.com/api',
'visible' => fn () => auth()->user()->isDeveloper(),
],
];
}
}
Register it in config/filament-navigation-manager.php:
'providers' => [
\App\Providers\CustomMenuProvider::class,
],
Menu Caching
Cache menus for performance (e.g., in AppServiceProvider):
public function boot() {
Cache::remember('filament-navigation-menus', now()->addHours(1), function () {
return \Lunestudio\FilamentNavigationManager\Facades\NavigationManager::getAllMenus();
});
}
Multi-Tenant Menus
Scope menus to tenants by overriding the query in the Menu model:
protected static function booted() {
static::addGlobalScope('tenant', function (Builder $builder) {
$builder->where('tenant_id', tenant()->id);
});
}
Localization Use Filament’s localization features to support multi-language menus:
NavigationItem::make()
->label(__('menus.dashboard'))
->url('/admin/dashboard')
Migration Conflicts
filament-navigation-manager:install after creating custom Menu migrations may cause conflicts.php artisan migrate:fresh in a staging environment.Visibility Logic Overhead
visible() checks or use simpler conditions where possible.Plugin Registration Order
FilamentNavigationManagerPlugin::make() is not added before other plugins that modify the panel.plugins() array or use ->after()/->before() methods.URL Generation Edge Cases
url(fn () => Filament::getCurrentPanel()->getDashboardUrl())
Permission Caching
php artisan cache:clear
Log Menu Data Dump menu data for debugging:
dd(\Lunestudio\FilamentNavigationManager\Facades\NavigationManager::getMenu('dashboard'));
Check Visibility Rules Test visibility logic in Tinker:
php artisan tinker
>>> $menuItem->visible(auth()->user())
Inspect Published Assets Verify CSS/JS assets are published correctly:
php artisan vendor:publish --tag="filament-navigation-manager-assets"
Database Queries Enable query logging to debug slow menu loads:
DB::enableQueryLog();
$menus = \Lunestudio\FilamentNavigationManager\Facades\NavigationManager::getAllMenus();
dd(DB::getQueryLog());
Custom Menu Model
Extend the default Menu model to add fields (e.g., priority, color):
php artisan make:model MenuExtension --model=Lunestudio\FilamentNavigationManager\Models\Menu
Update the config to use your extended model.
Custom Navigation Item Types
Add new item types (e.g., "Button", "Divider") by extending the NavigationItem class:
class CustomNavigationItem extends NavigationItem {
public static function make(): static {
return new static();
}
public function getView(): string {
return 'filament-navigation-manager::custom-item';
}
}
Event Listeners
Hook into menu events (e.g., MenuCreated, MenuUpdated) to trigger actions:
use Lunestudio\FilamentNavigationManager\Events\MenuCreated;
MenuCreated::listen(function (MenuCreated $event) {
\Log::info("Menu '{$event->menu->name}' created by {$event->user->name}");
});
API Endpoints Expose menus via API using Filament’s HTTP layer:
Route::get('/api/menus', function () {
return \Lunestudio\FilamentNavigationManager\Facades\NavigationManager::getAllMenus();
});
Default Navigation Group
Set navigation_group in config to organize menus in Filament’s sidebar:
'resources' => [
'navigation_group' => 'Settings', // Groups under "Settings" in sidebar
],
Asset Publishing If styles/JS don’t load, republish assets:
php artisan vendor:publish --tag="filament-navigation-manager-assets" --force
Model Binding
Ensure the Menu model’s id column is `unsignedBigInteger
How can I help you explore Laravel packages today?