susantokun / filament-dynamic-menu
Database-driven dynamic navigation menus for Filament panels with multi-tenancy support.
Package info
github.com/susantokun/filament-dynamic-menu
pkg:composer/susantokun/filament-dynamic-menu
Requires
- php: ^8.2
- filament/filament: ^5.0
- spatie/laravel-package-tools: ^1.0
Requires (Dev)
- laravel/pint: ^1.0
- orchestra/testbench: ^9.0 || ^10.0
- phpunit/phpunit: ^10.0 || ^11.0
Suggests
- bezhansalleh/filament-shield: Auto-resolve Shield permissions for menu items (^3.0 || ^4.0)
- stancl/tenancy: Multi-tenancy support (^3.0)
README
Database-driven dynamic navigation menus for Filament panels with multi-tenancy support.
Alih-alih mendefinisikan navigasi secara statis di PanelProvider, package ini memungkinkan kamu mengelola sidebar menu langsung dari Filament admin panel — termasuk grup, item, visibility berbasis role/permission, badge, dan pengaturan sidebar.
Persyaratan
- PHP
^8.2 - Laravel
^11.0 - Filament
^5.0
Langkah Instalasi
1. Install via Composer
composer require susantokun/filament-dynamic-menu
2. Jalankan Perintah Install
php artisan filament-dynamic-menu:install
Perintah ini akan:
- Mempublish file konfigurasi (
config/filament-dynamic-menu.php) - Mempublish file migrasi ke
database/migrations/ - Mempublish file terjemahan (EN & ID)
- Mempublish file views
- Menanyakan apakah ingin langsung menjalankan migrasi
Gunakan opsi
--forcejika kamu ingin menimpa file yang sudah ada:php artisan filament-dynamic-menu:install --force
3. Aktifkan Dynamic Menu
Buka Filament admin panel, lalu navigasi ke Settings > Menu Settings > Settings. Aktifkan toggle Enable Dynamic Menu. Menu akan langsung berubah ke dynamic navigation berbasis database.
Saat
is_enableddimatikan (toggle off), Filament akan otomatis kembali ke navigasi default bawaan (auto-discovery dari resources/pages/clusters). Tidak perlu menyentuh.envatau config file.
4. Daftarkan Plugin di PanelProvider
Buka app/Providers/Filament/AdminPanelProvider.php (atau PanelProvider yang kamu gunakan), lalu tambahkan FilamentDynamicMenuPlugin ke ->plugins():
<?php namespace App\Providers\Filament; use Filament\Panel; use Filament\PanelProvider; use Susantokun\FilamentDynamicMenu\FilamentDynamicMenuPlugin; class AdminPanelProvider extends PanelProvider { public function panel(Panel $panel): Panel { return $panel ->default() ->id('admin') ->plugins([ FilamentDynamicMenuPlugin::make(), ]); } }
Selesai! Cukup tambahkan plugin, semua resource, page, cluster, dan navigasi otomatis terdaftar. Tidak perlu trait, tidak perlu daftar manual resource/page satu per satu.
5. (Opsional) Konfigurasi Role & Permission
Jika kamu menggunakan spatie/laravel-permission, tentukan model Role dan Permission di config/filament-dynamic-menu.php:
'role_model' => \Spatie\Permission\Models\Role::class, 'permission_model' => \Spatie\Permission\Models\Permission::class,
Jika kamu menggunakan bezhansalleh/filament-shield, package ini akan otomatis me-resolve nama permission dari Resource/Page/Cluster target.
Integrasi Legacy (Trait)
Jika kamu membutuhkan kontrol lebih granular (misalnya panel berbeda dengan konfigurasi berbeda), gunakan trait HasDynamicMenu:
Ubah registration_mode di config ke auto:
'registration_mode' => 'auto',
Lalu di PanelProvider:
use Susantokun\FilamentDynamicMenu\Traits\HasDynamicMenu; class AdminPanelProvider extends PanelProvider { use HasDynamicMenu; public function panel(Panel $panel): Panel { return $this->dynamicMenuSettings( $this->dynamicMenu($panel) ); } }
Hasil Akhir
Setelah semua langkah selesai, buka Filament admin panel kamu. Di sidebar akan muncul Settings > Menu Settings yang berisi:
| Menu | Fungsi |
|---|---|
| Groups | Kelola grup navigasi (nama, icon, urutan, visibility, role) |
| Items | Kelola item navigasi (Resource, Page, Cluster, URL, Separator) |
| Settings | Pengaturan sidebar: Enable/disable dynamic menu, collapsible groups, sidebar collapse |
Saat pertama kali, jika belum ada data menu, package akan otomatis menjalankan DefaultMenuSeeder yang membuat:
- Dashboard — item di root sidebar
- Settings — grup navigasi yang berisi:
- Menu Settings — akses ke cluster management menu
- Menu Groups — kelola grup navigasi
- Menu Items — kelola item navigasi
Konfigurasi Penting
| Key | Default | Keterangan |
|---|---|---|
tenant_mode |
single |
single, stancl, atau custom |
tenant_model |
null |
FQCN model tenant (untuk mode custom) |
cache.ttl |
86400 |
Cache TTL dalam detik (24 jam) |
shield_integration |
true |
Auto-resolve permission Shield |
auto_seed_on_empty |
true |
Auto-seed saat data menu kosong |
registration_mode |
plugin |
plugin (rekomendasi) atau auto (legacy) |
panel_id |
admin |
ID panel (hanya untuk mode auto) |
navigation.group |
Settings |
Sidebar group untuk Menu Settings |
Facade
Package ini menyediakan facade DynamicMenu:
use Susantokun\FilamentDynamicMenu\Facades\DynamicMenu; DynamicMenu::tenantMode(); // mode tenant yang digunakan DynamicMenu::getSettings(); // ambil pengaturan sidebar tenant DynamicMenu::clearCache(); // hapus cache menu
Multi-Tenancy
Package mendukung 3 mode tenant:
single— Tidak ada tenant, menu berlaku global.stancl— Menggunakan packagestancl/tenancy.custom— Menggunakan model tenant kustom kamu sendiri. Settenant_modeldi config.
Saat mode selain single, semua tabel akan memiliki kolom tenant_id dan data menu akan di-scope per tenant.
Lisensi
MIT