Installation:
composer require van-ons/filament-navigation
Publish the config (if needed):
php artisan vendor:publish --provider="VanOns\FilamentNavigation\FilamentNavigationServiceProvider" --tag="config"
Register the Plugin:
Add to app/Providers/Filament/AdminPanelProvider.php:
public function panel(Panel $panel): Panel
{
return $panel
->plugins([
\VanOns\FilamentNavigation\FilamentNavigationPlugin::make(),
]);
}
First Use Case:
/admin/resources/navigation).filament.admin.resources.posts.index) or resource (e.g., PostResource::class)./admin/navigation.Dynamic Menu Generation:
Use the Navigation resource to define menus programmatically:
use VanOns\FilamentNavigation\Resources\NavigationResource;
NavigationResource::getNavigation()
->addItem('Dashboard', 'filament.admin.dashboard')
->addItem('Posts', PostResource::class)
->addChild('Create Post', 'filament.admin.resources.posts.create');
Conditional Visibility: Hide/show items based on user roles or permissions:
NavigationResource::getNavigation()
->addItem('Admin', 'filament.admin.pages.admin')
->visible(fn () => auth()->user()->can('manage-admin'));
Nested Resource Integration: Link directly to Filament resources or custom pages:
NavigationResource::getNavigation()
->addItem('Users', UserResource::class)
->addItem('Settings', SettingsPage::class);
Custom Icons/Styling: Use Blade components or Tailwind classes:
->icon('heroicon-o-home')
->activeWhen(fn () => request()->is('admin/dashboard'))
->class('bg-blue-500 text-white');
Multi-Language Support: Use Filament’s localization features to translate menu items:
->title(__('filament-navigation::navigation.items.dashboard'));
API-Driven Menus:
Fetch navigation from an external API and hydrate the Navigation model:
$navigation = Navigation::first();
$navigation->items = collect(json_decode($apiResponse))->map(fn ($item) => [
'title' => $item->title,
'url' => $item->url,
'children' => $item->children ?? [],
]);
$navigation->save();
Event-Based Updates: Trigger navigation updates via events (e.g., after user login):
use VanOns\FilamentNavigation\Events\NavigationUpdated;
event(new NavigationUpdated());
Caching Issues:
php artisan filament:cache-clear
navigation is excluded from caching in config/filament.php:
'cache' => [
'enabled' => true,
'except' => ['navigation'],
],
URL Resolution:
filament.admin.resources.posts.index) for resource links to avoid 404s.routes/web.php before the Filament routes.Drag-and-Drop Glitches:
config/filament.php if drag-and-drop feels laggy:
'optimize' => false,
Permission Conflicts:
visible() conditions.canAccess()).visible() logic).\Log::debug('Navigation items:', [
'items' => \VanOns\FilamentNavigation\Resources\NavigationResource::getNavigation()->items,
]);
filament/spatie-laravel-settings) are modifying the navigation.Custom Navigation Providers:
Override the default provider in config/filament-navigation.php:
'navigation_provider' => \App\Providers\CustomNavigationProvider::class,
Implement VanOns\FilamentNavigation\Contracts\NavigationProvider.
Add Custom Fields:
Extend the NavigationItem model:
use VanOns\FilamentNavigation\Models\NavigationItem;
class ExtendedNavigationItem extends NavigationItem
{
protected $casts = [
'custom_data' => 'array',
];
}
Hook into Rendering:
Use Filament’s after hooks to modify navigation dynamically:
FilamentNavigation::after(function (Navigation $navigation) {
$navigation->items->first()->title = 'Updated Title';
});
Localization: Publish and extend the language files:
php artisan vendor:publish --provider="VanOns\FilamentNavigation\FilamentNavigationServiceProvider" --tag="lang"
How can I help you explore Laravel packages today?