Veritabanı yapımızı oluşturduk. Güçlü, tiplenmiş ve veri bekliyor. Ancak bir arayüz olmadan bir veritabanı, kapıları olmayan bir kütüphane gibidir: güvenli, ama işe yaramaz.
Bugün, o kapıları inşa edeceğiz.
İlk Filament Resources’larımızı oluşturacağız. Filament’te bir “Resource”, yönetim panelinde bir varlığın statik temsilidir. Modelinizin bir tabloda nasıl göründüğünü, bir formda nasıl davrandığını ve uygulamanızın geri kalanı ile nasıl ilişkilendiğini tanımlar.
Temel bir konudan başlıyoruz: Kategoriler.
1. Kategori Kaynağını Oluşturma
Filament, kaynakları oluşturmak için güçlü bir artisan komutu sağlar. Kategorilerimizin kolayca yönetilebilir olmasını istiyoruz; listeyi terk etmeden. Tek bir sayfada, modaller kullanarak Oluşturma, Okuma, Güncelleme ve Silme (CRUD) işlemlerini gerçekleştiren “Basit Bir Kaynak” istiyoruz.
Bu komutu çalıştırın:
php artisan make:filament-resource Category --simple
Bu iki önemli dosya oluşturur:
app/Filament/Resources/CategoryResource.php: Tablo ve form tanımı.app/Filament/Resources/CategoryResource/Pages/ManageCategories.php: Eylemleri yöneten sayfa kontrolcüsü.
Şu an /admin/categories adresine giderseniz, User seçenek kutusuyla bir form görebilirsiniz. Bu teknik olarak doğru, çünkü bir kategori bir kullanıcıya aittir, ancak pratikte yanlıştır. Bir kategori oluşturduğumda, onun bana ait olması gerekir. Kendimi bir listeden seçmemem gerekir.
2. Kapsama ve Bağlam
Çözmemiz gereken iki sorun var:
- Görünürlük: Diğer kullanıcılara ait kategorileri görebiliyorum.
- Oluşturma: Kullanıcıyı manuel olarak seçmem gerekiyor.
Görünürlüğü Düzeltme
Sadece kendi kayıtlarımı görmemi sağlamak için, kaynak tarafından kullanılan Eloquent sorgusunu kesin bir şekilde sınırlandırıyoruz. getEloquentQuery metodunu CategoryResource.php dosyasında geçersiz kılıyoruz.
public static function getEloquentQuery(): \Illuminate\Database\Eloquent\Builder
{
return parent::getEloquentQuery()->where('user_id', auth()->id());
}
Artık tablo yalnızca user_id’sinin oturum açmış kullanıcıyla eşleştiği kayıtları yükleyecek.
Oluşturmayı Düzeltme
Sonra formu temizliyoruz. CategoryResource::form() içinde user_id girişini tamamen kaldırıyoruz. Kullanıcının bu konuda endişelenmesini istemiyoruz.
Ancak veritabanı o ID’yi gerek duyar. Bu yüzden onu programlı olarak ekleyeceğiz.
app/Filament/Resources/CategoryResource/Pages/ManageCategories.php dosyasında CreateAction’ı değiştiriyoruz. Form gönderimini engellemek için mutateFormDataUsing kullanıyoruz ve form verileri veritabanına ulaşmadan önce geçerli kullanıcının ID’sini ekleyeceğiz.
protected function getHeaderActions(): array
{
return [
CreateAction::make()
->mutateDataUsing(function (array $data): array {
$data['user_id'] = auth()->id(); //
return $data;
}),
];
}
Ayrıca tablodan user sütununu kaldırıyoruz, böylece görünüm temiz kalıyor.
Veri kapsamını görmek için bu commite göz atabilirsiniz.
3. Banka Hesapları
Para bir eve ihtiyaç duyar. Aynı mantığı Banka Hesapları için uygularız.
- Kaynağı oluşturun:
php artisan make:filament-resource BankAccount --simple. - Sorguyu
BankAccountResourceiçinde sınırlandırın. -
ManageBankAccountsiçindeuser_id’i yerleştirin.
Veritabanınızı kontrol ederseniz, MoneyCast’in sessizce çalıştığını görebilirsiniz. Bakiye alanına “1000” yazdığınızda, bu veritabanında 100000 (sente) olarak saklanır, girdiyi belirli bir sayı olarak ele aldığınız varsayılarak.
Bir nokta var. Şu anki formu genel. Daha sonra, kullanıcı “10.00” yazdığında “1000” olarak saklanmasını sağlamak için ondalıklara doğru bir şekilde ihtiyaç duyacağız. Şu anda, ham girdiğe güveniyoruz.
Banka Hesabı kaynağının uygulamasını buradan inceleyebilirsiniz.
4. Bütçeler ve Sunum
Son olarak, Bütçeleri ele alalım. Burada Filament’in UI bileşenleri gerçekten öne çıkıyor.
Kaynağı oluşturun:
php artisan make:filament-resource Budget --simple
Bütçelerin bir type’ı vardır (Sıfırlama veya Devretme). Veritabanımızda bu bir Enum dizesidir. Filament’te bunu anında renklerle görselleştirmek istiyoruz.
Badge Sütunu
BudgetResource.php içinde bir TextColumn kullanabiliriz, ancak bunu bir badge olarak formatlayabiliriz.
TextColumn::make('type')
->badge()
->color(fn (BudgetType $state): string => match ($state) {
BudgetType::Reset => 'success',
BudgetType::Rollover => 'warning',
})
->searchable(),
Bu basit zincirleme, sıkıcı bir metin dizesini canlı, iletişimci bir UI öğesine dönüştürüyor.
Paranın Biçimlendirilmesi
Ayrıca bütçe tutarını sadece ham bir sayı olarak değil, gerçek bir para birimi olarak göstermek istiyoruz. Filament, bu amaçla özel bir money biçimlendirici sunar.
TextColumn::make('amount')
->money('EUR')
->sortable(),
Bu, hemen düzenli ve profesyonel bir görünüm sağlar.
Sonuç
Artık kişisel finans uygulamamızın üç işlevsel direğine sahibiz:
- Kategoriler harcamalarımızı etiketlemek için.
- Banka Hesapları zenginliğimizi saklamak için.
- Bütçeler tutumlu davranmalarını kontrol etmek için.
Ve önemli olan, bunlar oturum açmış kullanıcıya tamamen özel.
Bir sonraki derste, ilk kaynaklarımızı test edeceğiz. Yapmaya devam edin.
Kaynak: Orijinal Makale


