FilamentPHP, kullanıcılara işlem tamamlandığında geri bildirim sağlayan yerleşik bir import action sunar.
Bir import işlemi tamamlandığında, sonucunu gösteren bir bildirim görüntülenir ve başarısız satırları içeren bir CSV dosyasının indirme bağlantısı sağlanır.
Bu basit kullanım senaryoları için iyi çalışsa da, gerçek dünya uygulamalarında çabuk sınırlayıcı hale gelir:
- Import’ı başlatan kullanıcı dışında kimse hata dosyasına erişemez
- Bildirim kapatıldığında indirme bağlantısı kaybolur
- Önceki import’ları görüntüleme ya da yeniden analiz etme imkanı yoktur
👉 Takım ortamında bu hızlı bir şekilde sıkıntı yaratabilir.
Bu makalede, aşağıdaki amaca yönelik basit ve temiz bir çözüm uygulayacağız:
- Tüm import’ları bir Filament kaynağında listelemek
- Yetkilendirilmiş kullanıcıların hata CSV dosyalarını indirmesine izin vermek
- Geçmiş import’ları yönetmek ve silmek
Filament’in Varsayılan Davranışını Anlamak
Filament’in Varsayılan Davranışını Anlamak
Filament, import işlemlerini yönetmek için dahili bir model sağlar:
Filament\Actions\Imports\Models\Import
Bu model, birkaç yararlı nitelik içerir:
completed_at→ timestampprocessed_rows→ integertotal_rows→ integersuccessful_rows→ integer
Ayrıca aşağıdaki gibi hesaplanan değerleri de sunar:
$import->getFailedRowsCount()
Filament, başarısız satırları indirmek için kullanılan dahili bir rota tanımlar:
Route::get('/imports/{import}/failed-rows/download', DownloadImportFailureCsv::class)
->name();
Bu rotayı geçersiz kılmanıza gerek yok, biz sadece ona erişim kontrollerini ayarlayacağız.
Erişim Problemi
Erişim Problemi
Varsayılan olarak, eğer bir Politika tanımlanmışsa, Filament erişimi şu şekilde kısıtlar:
$importPolicy = Gate::getPolicyFor($import::class);
if (filled($importPolicy) && method_exists($importPolicy, )) {
Gate::forUser($user)->authorize(, Arr::wrap($import));
} else {
abort_unless($import->user()->is($user), 403);
}
Filament\Actions\Imports\Http\Controllers\DownloadImportFailureCsv Controller’ın bir kesiti
Bu, şunları gerektirir:
- Bir politika yoksa → yalnızca sahibi dosyayı indirebilir
- Bir politika varsa → Filament yetkilendirmeyi buna devreder
Çözüm oldukça basit: bir Politika tanımlayın.
Import Politikasını Oluşturma
Import Politikasını Oluşturma
Politikayı oluşturun:
php artisan make:policy ImportPolicy --model=\Actions\Imports\Models\Import"
İşte örnek bir uygulama:
namespace App\Policies;
use App\Enums\ImportImporterEnum;
use App\Enums\PermissionEnum;
use App\Models\User;
use App\Services\PermissionService;
use Filament\Actions\Imports\Models\Import;
use Illuminate\Auth\Access\HandlesAuthorization;
class ImportPolicy
{
use HandlesAuthorization;
public function __construct(protected PermissionService $permissionService) {}
public function viewAny(User $user): bool
{
return $user->hasPermissionTo($this->permissionService->getPermissionName(PermissionEnum::VIEW_ANY, Import::class));
}
public function view(User $user, Import $import): bool
{
if (is_null($import->completed_at) || $import->getFailedRowsCount() == 0) {
return false;
}
return $user->hasPermissionTo($this->permissionService->getPermissionName(PermissionEnum::VIEW, Import::class));
}
public function delete(User $user, Import $import): bool
{
if ($import->importer == ImportImporterEnum::PRODUCT_MAPPING->value) {
return false;
}
return $user->hasPermissionTo($this->permissionService->getPermissionName(PermissionEnum::DELETE, Import::class));
}
}
Bu örnekte, izinler bir rol/izin sistemi kullanılarak yönetilir (ör. Spatie Laravel Permission) ile kendi İzin Servisi ve Enum. Bu mantığı kendi uygulamanıza uyarlayın.
İdeal olarak, Filament,
viewyerine özel birdownloadmetodu kullanır, çünkü bunlar farklı endişeleri temsil eder. Ancak, basitlik için varsayılan davranışla devam edeceğiz.
Politikanın Kaydedilmesi
Politikanın Kaydedilmesi
Politikanızı hizmet sağlayıcınızda kaydetmeyi unutmayın:
use Filament\Actions\Imports\Models\Import;
public function boot(): void
{
Gate::policy(Import::class, ImportPolicy::class);
...
}
Filament Kaynağını Oluşturma
Filament Kaynağını Oluşturma
Artık import’ları yönetim panelinde görüntüleyelim:
php artisan make:filament-resource Import --model-namespace=Filament\\Actions\\Imports\\Models
Burada formlara ihtiyacımız yok, sadece bir listeleme sayfası gerekiyor. Bu nedenle Schemas formatını ve CreateImport ile EditImport gibi bazı sayfaları silebilirsiniz.
Kaynak Sınıfı
Kaynak Sınıfı
class ImportResource extends Resource
{
protected static ?string $model = Import::class;
public static function table(Table $table): Table
{
return ImportsTable::configure($table);
}
public static function getPages(): array
{
return [
=> ListImports::route(),
];
}
}
Import’lar Tablosunu Oluşturma
Import’lar Tablosunu Oluşturma
İşte tablonun basitleştirilmiş bir versiyonu:
class ImportsTable
{
public static function configure(Table $table): Table
{
return $table
->columns([
TextColumn::make()->searchable(),
TextColumn::make(),
TextColumn::make(),
TextColumn::make()->numeric(),
TextColumn::make()->numeric(),
TextColumn::make()->numeric(),
TextColumn::make()->sortable(),
])
->recordActions([
ActionGroup::make([
Action::make()
->label()
->color()
->icon(Heroicon::ArrowDownCircle)
->url(fn (Import $import) => URL::signedRoute(, [=> filament()->getAuthGuard(), => $import], absolute: false), shouldOpenInNewTab: true)
->authorize(),
DeleteAction::make(),
]),
])
->defaultSort(, );
}
}
Ana Özellik: Başarısız Satırları İndirme
Ana Özellik: Başarısız Satırları İndirme
En önemli kısım bu eylemdir:
Action::make()
Bu:
- Filament’in dahili imzalı rotasını kullanır
- Yetkilendirme için
viewpolitikasına dayanır
👉 Politika ile birleştirildiğinde, bu şunları garanti eder:
- Yalnızca yetkilendirilmiş kullanıcılar hata dosyalarına erişebilir
- İndirmeler güvenli kalır
- Kullanıcı deneyimi önemli ölçüde iyileşir
Nihai Sonuç
Nihai Sonuç
Artık yalnızca bir Politika ve bir Kaynak ile:
- Tam bir import geçmişi
- Hata CSV dosyalarına kalıcı erişim
- Takım dostu erişim kontrolü
- Daha temiz ve profesyonel bir yönetim deneyimi
Sonuç
Sonuç
Filament güçlü yapı taşları sağlar, ancak bazı özellikler, örneğin import geçmişi, tam anlamıyla parlayabilmesi için biraz özelleştirme gerektirir.
Bu yaklaşım sayesinde, gereksiz karmaşıklık eklemeden hem kullanılabilirliği hem de sürdürülebilirliği artırıyorsunuz.
Bundan sonraki aşamalarda şunları ekleyebilirsiniz:
- Tekrar deneme mekanizmaları
- Import durumu filtreleri
- vb.
🚀 Daha ileriye gitmek ister misiniz?
Filament ile ilgili daha fazla makale için Filament Mastery adresini ziyaret edin.
Üretim için hazır Laravel & Filament kurulumlarını da paylaşıyorum (Docker, CI/CD, dağıtım…).
Tam erişim için Erken Destekçiler kategorisine katılın
Kaynak: Orijinal Makale


