admin Öne Çıkan
19500 yıldız

Filament

Geliştirici: Dan Harrin & Topluluk

TALL stack üzerine kurulu, zarif ve son derece genişletilebilir admin paneli ve CRUD yönetim aracı.

Kurulum

Composer
composer require filament/filament

Dokümantasyon & Kullanım

Markdown

Filament

Filament, Laravel geliştiricileri için TALL stack (Tailwind CSS, Alpine.js, Laravel ve Livewire) mimarisi üzerine inşa edilmiş, modern, son derece genişletilebilir ve zarif bir açık kaynak yönetim paneli (admin panel), form oluşturucu, tablo yöneticisi ve bildirim ekosistemidir.

Neden Tercih Edilmeli?

  • Hızlı CRUD Üretimi: Tek bir Artisan komutu ile tam özellikli, filtreleme, arama ve sayfalama destekli yönetim panelleri kurar.
  • TALL Stack Mimarisi: Özel JavaScript veya derleme araçlarına ihtiyaç duymadan saf PHP ve Livewire ile zengin arayüzler geliştirilir.
  • Kapsamlı Bileşen Ekosistemi: Form Builder, Table Builder, Notification, Widget ve Actions kütüphanelerini tek çatı altında barındırır.
  • Çoklu Panel Desteği: Aynı Laravel uygulamasında hem /admin, hem /app, hem de /customer gibi bağımsız paneller oluşturabilir.
  • Zengin Topluluk Eklentileri: Grafikler, rol yönetimi, harita entegrasyonları gibi yüzlerce hazır eklenti desteği vardır.

Kurulum

Filament v3 panel paketini Composer ile kurun:

composer require filament/filament:"^3.2" -W

Panel sağlayıcısını yükleyin:

php artisan filament:install --panels

Bu komut app/Providers/Filament/AdminPanelProvider.php dosyasını oluşturur ve /admin rotasını kullanıma açar.

Temel Kullanım

1. Panel Kullanıcısı Oluşturma

php artisan make:filament-user

2. CRUD Kaynağı (Resource) Oluşturma

Örneğin Post modeliniz için tam donanımlı bir yönetim sayfası üretin:

php artisan make:filament-resource Post --generate

Bu komut app/Filament/Resources/PostResource.php dosyasını oluşturur:

namespace App\Filament\Resources;

use App\Filament\Resources\PostResource\Pages;
use App\Models\Post;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\Resource;
use Filament\Tables;
use Filament\Tables\Table;

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    protected static ?string $navigationIcon = 'heroicon-o-document-text';

    public static function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('title')
                    ->required()
                    ->maxLength(255)
                    ->live(onBlur: true)
                    ->afterStateUpdated(fn ($state, callable $set) => $set('slug', \Str::slug($state))),

                Forms\Components\TextInput::make('slug')
                    ->required()
                    ->maxLength(255),

                Forms\Components\Select::make('category_id')
                    ->relationship('category', 'name')
                    ->searchable()
                    ->preload()
                    ->required(),

                Forms\Components\RichEditor::make('content')
                    ->columnSpanFull(),

                Forms\Components\Toggle::make('is_published')
                    ->default(false),
            ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                Tables\Columns\TextColumn::make('title')
                    ->searchable()
                    ->sortable(),

                Tables\Columns\TextColumn::make('category.name')
                    ->badge()
                    ->sortable(),

                Tables\Columns\IconColumn::make('is_published')
                    ->boolean()
                    ->sortable(),

                Tables\Columns\TextColumn::make('created_at')
                    ->dateTime('d.m.Y H:i')
                    ->sortable()
                    ->toggleable(isToggledHiddenByDefault: true),
            ])
            ->filters([
                Tables\Filters\TernaryFilter::make('is_published'),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }

    public static function getPages(): array
    {
        return [
            'index' => Pages\ListPosts::route('/'),
            'create' => Pages\CreatePost::route('/create'),
            'edit' => Pages\EditPost::route('/{record}/edit'),
        ];
    }
}