ویژگی تصویر

بابلز لرن

  /  filament   /  ساخت فرم در Filament و نمایش داده ها
بنر تبلیغاتی الف
آموزش PHP

در این آموزش یاد می‌گیریم چگونه با استفاده از Laravel و Filament یک فرم مدیریتی ایجاد کنیم که:

  • داخل پنل مدیریت نمایش داده شود
  • اطلاعات را در پایگاه داده ذخیره کند
  • داده‌های ثبت‌شده را به صورت جدول (CRUD کامل) نمایش دهد

این روش، استانداردترین و سریع‌ترین راه ساخت فرم‌های مدیریتی در Filament 3 است.


پیش‌نیازها

قبل از شروع، فرض می‌کنیم موارد زیر از قبل آماده هستند:

  • Laravel و Filament 3 به‌درستی نصب شده‌اند
  • پنل مدیریت از مسیر /admin در دسترس است
  • اتصال دیتابیس برقرار شده و migrationها اجرا شده‌اند

هدف نهایی

در پایان این آموزش، یک فرم ثبت پست خواهیم داشت با فیلدهای زیر:

  • عنوان (Title)
  • توضیحات (Body)
  • وضعیت فعال / غیرفعال (is_active)

و این داده‌ها:

  • در دیتابیس ذخیره می‌شوند
  • در پنل مدیریت به صورت جدول قابل مشاهده، ویرایش و حذف هستند

مرحله ۱: ساخت Model و Migration

ابتدا یک مدل به همراه migration ایجاد می‌کنیم:

php artisan make:model Post -m

سپس فایل migration ساخته‌شده در مسیر زیر را ویرایش می‌کنیم:

database/migrations/xxxx_create_posts_table.php
Schema::create('posts', function (Blueprint $table) {
    $table->id();
    $table->string('title');
    $table->text('body');
    $table->boolean('is_active')->default(true);
    $table->timestamps();
});

در نهایت migration را اجرا می‌کنیم:

php artisan migrate

مرحله ۲: ساخت Resource در Filament

در Filament، هر Resource به‌صورت خودکار یک CRUD کامل (فرم + جدول) ایجاد می‌کند.

php artisan make:filament-resource Post

پس از اجرای این دستور، ساختار زیر ایجاد می‌شود:

app/Filament/Resources/
 ├── PostResource.php
 └── PostResource/
     └── Pages/
         ├── CreatePost.php
         ├── EditPost.php
         └── ListPosts.php

مرحله ۳: تعریف فرم ثبت اطلاعات

فایل زیر را باز کنید:

app/Filament/Resources/PostResource.php

در متد form()، فیلدهای فرم را تعریف می‌کنیم:

use Filament\Forms;
use Filament\Forms\Form;

public static function form(Form $form): Form
{
    return $form->schema([
        Forms\Components\TextInput::make('title')
            ->label('عنوان')
            ->required()
            ->maxLength(255),

        Forms\Components\Textarea::make('body')
            ->label('توضیحات')
            ->required(),

        Forms\Components\Toggle::make('is_active')
            ->label('فعال؟')
            ->default(true),
    ]);
}

این فرم به‌صورت خودکار در صفحه Create و Edit پنل مدیریت استفاده می‌شود.


مرحله ۴: تعریف جدول نمایش داده‌ها

در همان فایل، متد table() را برای نمایش داده‌ها به صورت جدول تنظیم می‌کنیم:

use Filament\Tables;
use Filament\Tables\Table;

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

            Tables\Columns\IconColumn::make('is_active')
                ->label('وضعیت')
                ->boolean(),

            Tables\Columns\TextColumn::make('created_at')
                ->label('تاریخ ایجاد')
                ->date('Y-m-d'),
        ])
        ->actions([
            Tables\Actions\EditAction::make(),
            Tables\Actions\DeleteAction::make(),
        ]);
}

مرحله ۵: تنظیم fillable در Model (رفع خطای MassAssignment)

برای جلوگیری از خطای MassAssignmentException، باید فیلدها را در Model مجاز کنیم.

فایل زیر را ویرایش کنید:

app/Models/Post.php
class Post extends Model
{
    use HasFactory;

    protected $fillable = [
        'title',
        'body',
        'is_active',
    ];
}

این مرحله ضروری است؛ در غیر این صورت Laravel اجازه ذخیره داده‌ها را نمی‌دهد.


مرحله ۶: تست نهایی

سرور را اجرا کنید:

php artisan serve

سپس وارد پنل مدیریت شوید:

http://127.0.0.1:8000/admin

اکنون می‌توانید:

  • یک پست جدید ثبت کنید
  • داده‌ها را در جدول مشاهده کنید
  • ویرایش یا حذف انجام دهید

جمع‌بندی

با استفاده از Filament، بدون نوشتن Controller، Route یا View دستی، توانستیم:

  • یک فرم مدیریتی بسازیم
  • داده‌ها را در دیتابیس ذخیره کنیم
  • یک جدول مدیریتی کامل (CRUD) داشته باشیم

این ساختار، پایه‌ی اصلی توسعه پنل‌های حرفه‌ای در Laravel + Filament است.

آیا این مطلب برای شما مفید بود ؟

خیر
بله
موضوعات شما در انجمن: