Filament Shield Seeding Process
Dokumen ini menjelaskan cara mengelola Role dan Permission menggunakan Filament Shield, termasuk strategi seeding yang aman untuk environment testing.
1. Konsep Utama
Filament Shield menghasilkan permission berdasarkan Resource yang terdaftar. Jika Anda menambah Resource baru (misal: PostResource), Shield perlu dijalankan ulang agar permission resource tersebut ikut dibuat.
2. Cara Update Permission (Sync)
Setiap kali menambah Resource, mengubah Policy, atau mengubah konfigurasi filament-shield.php, jalankan:
php artisan shield:generate --all
Perintah ini memperbarui database/seeders/ShieldSeeder.php sebagai output generated.
3. Aturan Penting: Jangan Edit ShieldSeeder.php Manual
ShieldSeeder.php diperlakukan sebagai generated artifact. Jika Anda edit manual, perubahan akan hilang ketika command Shield dijalankan ulang.
Praktik di project ini:
ShieldSeeder.phpdipakai untuk non-testing (local/staging/production-like seeding).- Kebutuhan test-only dipindah ke
database/seeders/TestingShieldSeeder.php. - Pemilihan seeder dilakukan di
DatabaseSeederberdasarkan environment.
4. Alur Seeding di DatabaseSeeder
Pola yang dipakai saat ini:
public function run(): void
{
if (app()->environment('testing')) {
$this->call([
TestingShieldSeeder::class,
]);
return;
}
$this->call([
ShieldSeeder::class,
PostSeeder::class,
]);
}
Tujuannya:
- Jalur testing stabil dan tidak tergantung file generated yang bisa berubah.
- Jalur non-testing tetap mengikuti sumber permission resmi dari Shield.
5. Kustomisasi Role/Permission dengan Aman
Jika perlu menambah behavior:
- Gunakan
shield:generate --alluntuk update struktur permission utama. - Jangan edit
ShieldSeeder.phpsecara manual untuk kebutuhan test. - Letakkan kebutuhan khusus test di
TestingShieldSeeder.php. - Untuk user test, gunakan password plain agar cast
hashedmengikuti konfigurasi hash environment testing.
6. Troubleshooting
Jika role/permission tidak sesuai:
- Jalankan
php artisan permission:cache-reset. - Verifikasi resource sudah terdaftar di
config/filament-shield.php. - Pastikan test dijalankan dengan environment testing yang benar (
APP_ENV=testing).