Filament menawarkan sesuatu yang sulit ditolak: admin panel jadi tanpa harus dibangun dari nol. Penulis memakainya di tujuh proyek yang ada di portofolio ini, dari ERP dengan lebih dari dua puluh resource sampai buku kas untuk organisasi kecil. Artikel ini merangkum kerangka yang selalu penulis pakai ulang, plus daftar tool yang menurut penulis layak dipasang sejak awal.
Kerangka yang Selalu Sama
Filament berdiri di atas Livewire dan Alpine.js, jadi hampir semua kebutuhan panel admin sudah tersedia sebagai komponen. Yang membuat proyek berjalan cepat bukan jumlah plugin, melainkan keputusan struktur yang diambil sejak awal. Penulis selalu kembali ke empat hal yang sama.
Pertama, satu resource adalah satu tempat definisi: form untuk input, table untuk daftar, detail untuk pembacaan. Di Tams ERP ada lebih dari dua puluh resource dan semuanya mengikuti bentuk yang sama, sehingga penulis bisa berpindah antarlayar tanpa membaca ulang kode. Filament menghasilkan sebagian besar kerangka itu sendiri; yang penulis jaga hanya konsistensi penamaan, urutan field, dan validasi.
public static function form(Form $form): Form
{
return $form->schema([
TextInput::make('code')->required(),
Select::make('pool_id')->relationship('pool', 'name')->required(),
]);
}
Kedua, izin tidak pernah ditanam di dalam resource. Satu policy per model, dengan Filament Shield sebagai generator permission supaya daftar izin tidak diketik manual. Di proyek yang punya alur approval berlapis, seperti helpdesk internal dan sistem pemesanan tiket produksi, pertanyaan "boleh atau tidak" selalu dijawab oleh policy:
public function approve(User $user, Ticket $ticket): bool
{
return $user->can('ticket.approve')
&& $ticket->waitingFor($user->division);
}
Ketiga, logika bisnis hidup di service layer, bukan di form action. Contoh yang paling sering penulis pakai di Tams ERP: mengedit satu transaksi harus ikut merevalidasi stok. Kalau aturan itu tertanam di action, ia hanya berlaku saat diedit lewat panel; setelah dipindah ke service, alur yang sama bisa dipanggil dari impor data, job, atau skrip migrasi.
StockRevalidationService::revalidate($transaction);
Keempat, relation manager dipakai untuk transaksi berantai: cicilan supplier per pool di Tams ERP, atau modul tiket yang berbagi status dengan modul aset di helpdesk. Relasi penulis tampilkan di halaman resource yang sama hanya kalau relasinya memang diubah dari konteks induknya. Selebihnya, cukup lewat halaman resource-nya sendiri.
Snippet di atas memakai API Filament v4 dan v5. Kodenya ilustratif, dibentuk dari pola yang penulis pakai di proyek-proyek tersebut, bukan salinan kode produksi.
Tool yang Relevan
Daftar yang selalu penulis pertimbangkan di setiap proyek baru:
- Filament Shield (
bezhansalleh/filament-shield): generator izin berbasisspatie/laravel-permission. Policy dan permission terisi otomatis, bukan diketik manual. Ini fondasi RBAC di helpdesk dan sistem approval tiket. - Auth UI Enhancer (
diogogpinto/filament-auth-ui-enhancer): halaman login default Filament terlihat sama di mana-mana. Plugin ini membuatnya bisa dibentuk ulang tanpa menulis sendiri view autentikasinya. - ApexCharts (
leandrocfe/filament-apex-charts): widget chart untuk dashboard. Penulis memakainya untuk angka yang sering diminta atasan: jumlah tiket terbuka, tren mingguan, ringkasan yang butuh konteks cepat. - Filament Bug Reports (
cerealkiller97/filament-bug-reports): pengguna non-developer bisa melaporkan bug dari dalam panel, dan laporan yang tervalidasi masuk ke GitHub Issues. Menggantikan biasanya "coba jelaskan lewat WhatsApp". - Spatie Media Library (
filament/spatie-laravel-media-library-plugin): upload, koleksi, dan manipulasi gambar. Langsung dipasang begitu ada kebutuhan file atau galeri. - FilaCheck (
laraveldaily/filacheck): analisis statis untuk proyek Filament. Mengecek dependensi dan pola penulisan yang sudah deprecated dengan cepat, sehingga kode lama ketahuan sebelum jadi masalah saat upgrade berikutnya. - Laravel Debugbar (
barryvdh/laravel-debugbar): bukan plugin Filament, tapi wajib saat menulis resource baru. Panel query-nya langsung menunjukkan N+1 dari eager load yang terlewat, sebelum kode itu dibawa ke produksi.
Batasannya
Kapan Filament tidak dipakai? Pelajarannya datang dari Saksi Virtual. Sisi publiknya adalah landing page yang tujuannya mengubah pengunjung jadi pesanan WhatsApp, dan untuk itu penulis memilih React dengan Inertia di sisi frontend. Filament hanya menangani CMS-nya, supaya klien bisa mengubah teks dan gambar sendiri. Filament alat admin yang sangat baik; memaksanya menjadi halaman publik hanya membuat halaman publik itu terlihat seperti panel admin.
Penutup
Boilerplate yang penulis maksud di sini bukan repo starter, melainkan kebiasaan: resource yang seragam, policy yang memegang izin, service yang memegang aturan, dan tool yang masuk karena ada kebutuhan, bukan karena bisa dipasang. Tujuh proyek berjalan di kerangka yang sama dan hanya berbeda pada model datanya. Bagian itu yang tidak bisa di-boilerplate-kan: penulis tetap harus duduk dan memahami masalahnya lebih dulu.

