كل أداة داخلية تحتاج في النهاية إلى لوحة تحكم إدارية. سواء كنت تطلق منتج SaaS أو تدير متجراً إلكترونياً أو نظام CRM داخلياً، سيحتاج شخص ما في الفريق إلى واجهة نظيفة لإدارة المستخدمين والطلبات والمحتوى والإعدادات. في النظام البيئي للارافيل في عام 2026، الإجابة واضحة لا لبس فيها — أصبح Filament v3 الحل المهيمن. فهو يجمع بين إنتاجية Livewire 3 وأناقة Tailwind CSS v4 ونظام مكونات قوي ومدروس يتيح لك بناء لوحة تحكم مصقولة في ساعات بدلاً من أسابيع.
في هذا الدرس، سنبني NoqtaShop Admin، لوحة تحكم وظيفية بالكامل لمتجر إلكتروني افتراضي. في النهاية، ستحصل على لوحة معلومات تعمل بكفاءة مع المنتجات والفئات والطلبات والتحكم في الصلاحيات بناءً على الأدوار وتعدد المستأجرين والأدوات المخصصة وإصدار جاهز للنشر إلى الإنتاج.
المتطلبات المسبقة
قبل البدء، تأكد من توفر ما يلي:
- PHP الإصدار 8.3 أو أحدث
- Composer الإصدار 2.7 أو أحدث
- Node.js الإصدار 20 أو أحدث لتجميع الأصول
- معرفة عملية بتوجيه لارافيل ونماذجه وعمليات الترحيل
- إلمام بـ Eloquent وBlade
- محرر أكواد مثل VS Code أو PhpStorm
- قاعدة بيانات محلية (PostgreSQL أو MySQL — سنستخدم PostgreSQL)
يفترض هذا الدرس خبرة متوسطة في لارافيل. إذا كنت جديداً تماماً على لارافيل، فابدأ أولاً بـ Laravel Bootcamp الرسمي ثم عد إلى هنا.
ما الذي ستبنيه
ستتضمن لوحة NoqtaShop Admin ما يلي:
- شاشة تسجيل دخول مصقولة مع مصادقة بالبريد الإلكتروني وكلمة المرور
- لوحة معلومات تعرض أدوات الإيرادات وآخر الطلبات ومخطط المبيعات
- مصادر للمنتجات والفئات والطلبات، مع صفحات CRUD كاملة
- جداول قابلة للبحث والتصفية والفرز مع إجراءات جماعية
- مكونات نماذج مخصصة لمتغيرات المنتج وأوصاف نصية غنية
- صلاحيات قائمة على الأدوار باستخدام spatie/laravel-permission
- حدود متعددة المستأجرين بحيث يرى كل مالك متجر بياناته فقط
- تحميل ملفات إلى التخزين المحلي مع معاينات الصور
- إصدار إنتاج جاهز مع إشعارات في الطابور ونسخ احتياطية لقاعدة البيانات
لماذا Filament v3 في عام 2026
قبل ثلاث سنوات، كان بناء لوحة تحكم لارافيل يعني الجمع بين تراخيص Nova وإضافات Backpack أو لوحات Vue المصنوعة يدوياً. كان لكل خيار سلبيات حقيقية. كان Nova مكلفاً وبطيء التطور، وكان Backpack يتطلب تكويناً معقداً، وكانت اللوحات المخصصة تعيد اختراع العجلة في كل مشروع.
غيّر Filament v3 المعادلة. فهو مفتوح المصدر ويأتي مع Livewire 3 وAlpine.js جاهزَين، ومكتبة المكونات الخاصة به هي الأكثر صقلاً في النظام البيئي لـ PHP. أضاف الإصدار v3 تبديل اللوحات وتعدد المستأجرين والقوالب المخصصة ونظام إجراءات يتيح لك تأليف الأزرار والنوافذ المنبثقة والتأكيدات بشكل تصريحي. نما المجتمع بشكل كبير، حيث يقدم مئات الإضافات المجتمعية تغطي كل شيء من مكتبات الوسائط إلى الامتثال لـ GDPR.
مقارنة بـ Backpack، يمنحك Filament لغة تصميم أكثر تماسكاً وأقل مفاجآت عند التخصيص. مقارنة بـ Nova، فهو مجاني تماماً ويتطور بإيقاع أسرع. مقارنة بلوحة React مصنوعة يدوياً، فهو يُشحن في أيام بدلاً من أشهر.
الخطوة 1: إعداد المشروع
لنبدأ بإنشاء مشروع لارافيل 11 جديد. افتح طرفيتك وشغّل مثبّت لارافيل.
composer create-project laravel/laravel:^11.0 noqtashop
cd noqtashopأعدّ قاعدة بياناتك في ملف .env. نوصي بـ PostgreSQL لدعمها الأغنى للـ JSON والبحث النصي الكامل، لكن MySQL يعمل بنفس الكفاءة.
DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=noqtashop
DB_USERNAME=postgres
DB_PASSWORD=secret
APP_NAME="NoqtaShop Admin"
APP_URL=http://localhost:8000أنشئ قاعدة البيانات ثم شغّل عمليات الترحيل الأولية للتأكد من عمل الاتصال.
createdb noqtashop
php artisan migrateإذا نجحت عمليات الترحيل، فأنت جاهز لتثبيت Filament.
الخطوة 2: تثبيت Filament v3
ثبّت حزمة Filament باستخدام Composer.
composer require filament/filament:"^3.3" -Wالآن شغّل مثبّت اللوحة. سيقوم Filament بإنشاء مزوّد اللوحة وتسجيل المسارات ونشر قالب البداية.
php artisan filament:install --panelsعندما يُطلب منك معرّف اللوحة، أدخل admin. يُنشئ المثبّت الملف app/Providers/Filament/AdminPanelProvider.php، وهو نقطة الدخول لجميع إعدادات الإدارة.
أنشئ مستخدم الإدارة الأول. هذا الأمر ينشئ صفاً في جدول users ويمنحه حق الوصول إلى اللوحة.
php artisan make:filament-userاملأ المعلومات المطلوبة باسمك وبريدك الإلكتروني وكلمة مرور قوية. الآن شغّل خادم التطوير وخادم Vite في طرفيتين منفصلتين.
php artisan serve
npm install && npm run devافتح http://localhost:8000/admin وسجّل الدخول. سترى لوحة Filament فارغة. الواجهة مصقولة جاهزة — الشريط الجانبي والشريط العلوي ومفتاح الوضع الداكن وفتات التنقل تعمل جميعها بشكل افتراضي.
الخطوة 3: نمذجة المجال
قبل توليد مصادر Filament، نحتاج إلى بيانات حقيقية. أنشئ نماذج المجال لمتجرنا.
php artisan make:model Category -m
php artisan make:model Product -m
php artisan make:model Order -m
php artisan make:model OrderItem -mافتح database/migrations/xxxx_create_categories_table.php وعرّف المخطط.
Schema::create('categories', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->text('description')->nullable();
$table->boolean('is_visible')->default(true);
$table->unsignedBigInteger('parent_id')->nullable();
$table->foreign('parent_id')->references('id')->on('categories')->nullOnDelete();
$table->timestamps();
});عرّف جدول المنتجات بعد ذلك. نستخدم أعمدة JSON للمتغيرات وعلاقة متعددة الأشكال للوسائط.
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->foreignId('category_id')->constrained()->cascadeOnDelete();
$table->string('name');
$table->string('slug')->unique();
$table->text('description')->nullable();
$table->decimal('price', 10, 2);
$table->integer('stock')->default(0);
$table->string('sku')->unique();
$table->boolean('is_visible')->default(true);
$table->boolean('is_featured')->default(false);
$table->json('variants')->nullable();
$table->string('image')->nullable();
$table->timestamps();
});مخطط الطلبات مباشر — صف رئيسي بالإضافة إلى جدول العناصر.
Schema::create('orders', function (Blueprint $table) {
$table->id();
$table->string('number')->unique();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->string('status')->default('pending');
$table->decimal('total', 10, 2);
$table->string('currency', 3)->default('USD');
$table->text('notes')->nullable();
$table->timestamps();
});
Schema::create('order_items', function (Blueprint $table) {
$table->id();
$table->foreignId('order_id')->constrained()->cascadeOnDelete();
$table->foreignId('product_id')->constrained();
$table->integer('quantity');
$table->decimal('unit_price', 10, 2);
$table->timestamps();
});أضف العلاقات إلى النماذج. افتح app/Models/Product.php وعرّف الروابط.
class Product extends Model
{
protected $fillable = [
'category_id', 'name', 'slug', 'description',
'price', 'stock', 'sku', 'is_visible', 'is_featured',
'variants', 'image',
];
protected $casts = [
'price' => 'decimal:2',
'is_visible' => 'boolean',
'is_featured' => 'boolean',
'variants' => 'array',
];
public function category()
{
return $this->belongsTo(Category::class);
}
}شغّل عمليات الترحيل وأضف بعض الفئات حتى نمتلك بيانات للعمل عليها.
php artisan migrate
php artisan tinkerداخل Tinker، أنشئ ثلاث فئات تجريبية.
\App\Models\Category::create(['name' => 'Apparel', 'slug' => 'apparel']);
\App\Models\Category::create(['name' => 'Electronics', 'slug' => 'electronics']);
\App\Models\Category::create(['name' => 'Books', 'slug' => 'books']);
exitالخطوة 4: توليد أول مصدر
مصادر Filament عبارة عن فئات PHP تصف كيفية عرض النموذج في اللوحة. ولّد مصدراً لنموذج Category.
php artisan make:filament-resource Category --generateعلامة --generate تخبر Filament بفحص أعمدة قاعدة البيانات وإنتاج مخطط افتراضي معقول. حدّث لوحة الإدارة — سترى رابط Categories جديد في الشريط الجانبي.
ادخل إلى Categories. تعرض صفحة القائمة جدولاً يحتوي على أعمدة الاسم والـ slug، وزر Create Category يأخذك إلى نموذج. عمليات CRUD وظيفية بدون كتابة أي كود.
الآن لنخصصها. افتح app/Filament/Resources/CategoryResource.php وحسّن النموذج.
public static function form(Form $form): Form
{
return $form->schema([
Forms\Components\TextInput::make('name')
->required()
->maxLength(255)
->live(onBlur: true)
->afterStateUpdated(fn (string $state, callable $set) =>
$set('slug', Str::slug($state))
),
Forms\Components\TextInput::make('slug')
->required()
->unique(ignoreRecord: true),
Forms\Components\Textarea::make('description')
->rows(4),
Forms\Components\Toggle::make('is_visible')
->label('Visible to customers')
->default(true),
Forms\Components\Select::make('parent_id')
->label('Parent category')
->relationship('parent', 'name')
->searchable(),
]);
}المُعدِّل live(onBlur: true) يخبر Filament بالاستماع لأحداث blur وتعبئة الـ slug تلقائياً عند إدخال الاسم. هذه اللمسات الصغيرة هي ما يجعل Filament يبدو منتهياً بإتقان.
الخطوة 5: بناء مصدر منتج مصقول
شغّل المولّد للمنتجات أيضاً.
php artisan make:filament-resource Product --generateافتح ProductResource.php واستبدل مخطط النموذج بنسخة أغنى تستخدم الأقسام والأعمدة.
public static function form(Form $form): Form
{
return $form->schema([
Forms\Components\Section::make('Basic information')
->columns(2)
->schema([
Forms\Components\TextInput::make('name')
->required()
->live(onBlur: true)
->afterStateUpdated(fn ($state, callable $set) =>
$set('slug', Str::slug($state))
),
Forms\Components\TextInput::make('slug')
->required()
->unique(ignoreRecord: true),
Forms\Components\Select::make('category_id')
->relationship('category', 'name')
->required()
->searchable()
->preload(),
Forms\Components\TextInput::make('sku')
->required()
->unique(ignoreRecord: true),
]),
Forms\Components\Section::make('Pricing and stock')
->columns(3)
->schema([
Forms\Components\TextInput::make('price')
->numeric()
->prefix('$')
->required(),
Forms\Components\TextInput::make('stock')
->numeric()
->default(0),
Forms\Components\Toggle::make('is_visible')
->default(true),
]),
Forms\Components\Section::make('Description')
->schema([
Forms\Components\RichEditor::make('description')
->columnSpanFull(),
]),
Forms\Components\Section::make('Image')
->schema([
Forms\Components\FileUpload::make('image')
->image()
->imageEditor()
->directory('products')
->columnSpanFull(),
]),
]);
}أصبح النموذج الآن يبدو كمحرّر منتجات حقيقي — تجمع الأقسام الحقول المرتبطة، ومحرر النصوص الغني يتعامل مع الوصف، ومكوّن تحميل الملفات يدعم القص وإعادة التحجيم في المتصفح.
بعد ذلك، خصّص الجدول.
public static function table(Table $table): Table
{
return $table
->columns([
Tables\Columns\ImageColumn::make('image')
->circular(),
Tables\Columns\TextColumn::make('name')
->searchable()
->sortable(),
Tables\Columns\TextColumn::make('category.name')
->label('Category')
->sortable(),
Tables\Columns\TextColumn::make('price')
->money('USD')
->sortable(),
Tables\Columns\TextColumn::make('stock')
->sortable()
->badge()
->color(fn (int $state): string => match (true) {
$state === 0 => 'danger',
$state < 10 => 'warning',
default => 'success',
}),
Tables\Columns\IconColumn::make('is_visible')
->boolean(),
])
->filters([
Tables\Filters\SelectFilter::make('category')
->relationship('category', 'name'),
Tables\Filters\TernaryFilter::make('is_visible'),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
Tables\Actions\DeleteBulkAction::make(),
]),
]);
}المُعدِّل badge() على عمود المخزون مع الألوان الشرطية مثال رائع على كيف يحافظ Filament على واجهة برمجة التطبيقات سهلة الاستخدام. بتعبير واحد، يتحول المخزون المنخفض إلى الأصفر والمنفذ إلى الأحمر.
الخطوة 6: إضافة مصدر الطلبات ومدير العلاقات
الطلبات أكثر تعقيداً لأنها تحتوي على عناصر فرعية. ولّد المصدر أولاً.
php artisan make:filament-resource Order --generateالآن ولّد مدير علاقات لعناصر الطلب. مديرو العلاقات هم جداول متداخلة تظهر في صفحة تفاصيل المصدر الأصل.
php artisan make:filament-relation-manager OrderResource items product_idهذا يولّد OrderResource/RelationManagers/ItemsRelationManager.php. اضبطه لعرض عناصر الطلب بشكل مدمج.
public function table(Table $table): Table
{
return $table
->recordTitleAttribute('product.name')
->columns([
Tables\Columns\TextColumn::make('product.name'),
Tables\Columns\TextColumn::make('quantity'),
Tables\Columns\TextColumn::make('unit_price')->money('USD'),
])
->headerActions([
Tables\Actions\CreateAction::make()
->form([
Forms\Components\Select::make('product_id')
->relationship('product', 'name')
->required(),
Forms\Components\TextInput::make('quantity')
->numeric()
->required(),
Forms\Components\TextInput::make('unit_price')
->numeric()
->required(),
]),
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\DeleteAction::make(),
]);
}سجّل مدير العلاقات في المصدر الأصلي بإضافته إلى دالة getRelations في OrderResource.
public static function getRelations(): array
{
return [
RelationManagers\ItemsRelationManager::class,
];
}الآن عند فتح طلب، سترى جدولاً مدمجاً لعناصر الطلب. يمكنك إضافة الصفوف وتعديلها وإزالتها دون مغادرة الصفحة.
الخطوة 7: أدوات لوحة المعلومات المخصصة
لوحة معلومات Filament الافتراضية فارغة. دعنا نضيف ثلاث أدوات — نظرة عامة على الإحصائيات، ومخطط، وجدول لآخر الطلبات.
php artisan make:filament-widget RevenueOverview --stats-overviewافتح app/Filament/Widgets/RevenueOverview.php واستبدل محتواها بأرقام حقيقية.
class RevenueOverview extends BaseWidget
{
protected function getStats(): array
{
return [
Stat::make('Total revenue', '$' . number_format(Order::sum('total'), 2))
->description('All time')
->descriptionIcon('heroicon-m-arrow-trending-up')
->color('success'),
Stat::make('Orders this month', Order::whereMonth('created_at', now()->month)->count())
->description('Created in current month')
->color('primary'),
Stat::make('Active products', Product::where('is_visible', true)->count())
->color('warning'),
];
}
}ولّد أداة مخطط للمبيعات عبر الزمن.
php artisan make:filament-widget SalesChart --chartفي SalesChart.php، أعد مجموعة بيانات تُجمّع الطلبات يومياً للثلاثين يوماً الماضية.
protected function getData(): array
{
$data = Trend::model(Order::class)
->between(start: now()->subDays(30), end: now())
->perDay()
->sum('total');
return [
'datasets' => [
[
'label' => 'Daily revenue',
'data' => $data->map(fn ($value) => $value->aggregate),
'fill' => true,
],
],
'labels' => $data->map(fn ($value) => $value->date),
];
}
protected function getType(): string
{
return 'line';
}المساعد Trend يأتي من flowframe/laravel-trend، حزمة صغيرة تحوّل استعلامات السلاسل الزمنية إلى سطر واحد. ثبّتها الآن.
composer require flowframe/laravel-trendأعد تحميل لوحة المعلومات. سترى إحصائيات إيرادات حقيقية ومخططاً بيانياً. أضف الأدوات إلى لوحة المعلومات بتعديل AdminPanelProvider.
->widgets([
Widgets\RevenueOverview::class,
Widgets\SalesChart::class,
])الخطوة 8: التحكم في الصلاحيات بناءً على الأدوار
تحتاج لوحة الإدارة الحقيقية إلى أدوار وصلاحيات. ثبّت حزمة spatie التي تتكامل بسلاسة مع Filament عبر إضافة مجتمعية.
composer require spatie/laravel-permission
composer require bezhansalleh/filament-shield
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate
php artisan shield:install adminينشئ مثبّت Shield مصدر Roles ويولّد الصلاحيات الافتراضية ويحدّث نموذج User ليستخدم سمة HasRoles. شغّل مولّد الصلاحيات لإنشاء صلاحيات لكل مصدر.
php artisan shield:generate --allافتح اللوحة وسترى قسم Roles جديداً. أنشئ دور Manager، وعيّن صلاحيات العرض والتعديل للمنتجات والطلبات، ثم أنشئ مستخدم مدير ثانياً معيّناً لذلك الدور. سجّل الدخول بهذا المستخدم وتحقق من أن الشريط الجانبي يعرض فقط المصادر التي يمكنه الوصول إليها.
للإنتاج، احمِ اللوحة نفسها بواجهة canAccessPanel من Filament على نموذج المستخدم.
class User extends Authenticatable implements FilamentUser
{
public function canAccessPanel(Panel $panel): bool
{
return $this->hasAnyRole(['super_admin', 'manager']);
}
}الخطوة 9: تعدد المستأجرين
قدّم Filament v3 دعماً درجة أولى لتعدد المستأجرين. يصبح كل مستأجر نطاقاً في الرابط وقيداً على كل استعلام. سننمذج المستأجرين كمتاجر.
php artisan make:model Shop -mعرّف الترحيل ونموذج Shop مع علاقة بالمستخدمين.
Schema::create('shops', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->timestamps();
});
Schema::create('shop_user', function (Blueprint $table) {
$table->foreignId('shop_id')->constrained()->cascadeOnDelete();
$table->foreignId('user_id')->constrained()->cascadeOnDelete();
$table->primary(['shop_id', 'user_id']);
});أضف عمود shop_id إلى المنتجات والطلبات، ثم فعّل تعدد المستأجرين في AdminPanelProvider.
return $panel
->id('admin')
->path('admin')
->tenant(Shop::class, slugAttribute: 'slug')
->tenantRegistration(RegisterShop::class);نفّذ واجهة HasTenants على نموذج المستخدم حتى يعرف Filament المتاجر التي ينتمي إليها المستخدم.
class User extends Authenticatable implements FilamentUser, HasTenants
{
public function getTenants(Panel $panel): Collection
{
return $this->shops;
}
public function canAccessTenant(Model $tenant): bool
{
return $this->shops()->whereKey($tenant)->exists();
}
}سيعرض Filament الآن مبدّل المستأجرين في الشريط العلوي. تصبح الروابط /admin/{shopSlug}/products، وتُحدد الاستعلامات تلقائياً للمستأجر النشط.
الخطوة 10: تخزين الملفات والنسخ الاحتياطية
أعدّ تخزين الملفات المحلي لصور المنتجات. في config/filesystems.php، تأكد من أن قرص public مرتبط رمزياً.
php artisan storage:linkللإنتاج، انتقل بالقرص إلى S3 أو مزوّد متوافق مثل Cloudflare R2. أضف بيانات الاعتماد إلى .env وغيّر مكوّن FileUpload لاستخدام القرص المُعدّ.
Forms\Components\FileUpload::make('image')
->image()
->disk('s3')
->visibility('public')
->directory('products')ثبّت حزمة Spatie للنسخ الاحتياطي حتى تنام مرتاحاً.
composer require spatie/laravel-backup
php artisan vendor:publish --provider="Spatie\Backup\BackupServiceProvider"جدوِل نسخة احتياطية ليلية في app/Console/Kernel.php.
$schedule->command('backup:run')->dailyAt('02:00');
$schedule->command('backup:clean')->dailyAt('02:30');الخطوة 11: النشر إلى الإنتاج
للإنتاج، نوصي بـ Laravel Forge أو نشر مبني على Docker على Coolify. في كلتا الحالتين، سير العمل واحد. اسحب الكود، ثبّت تبعيات Composer وnpm، ابنِ الأصول، وشغّل عمليات الترحيل.
نص نشر نموذجي يبدو كالتالي.
git pull origin main
composer install --no-dev --optimize-autoloader
npm ci && npm run build
php artisan migrate --force
php artisan filament:cache-components
php artisan icons:cache
php artisan optimize
php artisan queue:restartالأمر filament:cache-components يقوم بترجمة عروض Blade لمكونات Filament مسبقاً، مما يقلل من زمن انتقال الطلب الأول بمئات المللي ثانية. شغّل optimize لتخزين الإعدادات والمسارات في الذاكرة المؤقتة.
أعدّ عامل طوابير عبر Supervisor أو systemd، حيث يستخدم Filament إشعارات في الطابور ويمكن تأجيل الإجراءات الجماعية.
[program:noqtashop-worker]
command=php /srv/noqtashop/artisan queue:work --tries=3 --timeout=90
autostart=true
autorestart=true
user=deploy
numprocs=2اختبار التنفيذ الخاص بك
يتكامل Filament مع مساعدات اختبار HTTP في لارافيل. اكتب اختبار سلامة سريعاً للتأكد من تحميل لوحة المعلومات.
test('admin dashboard loads for authenticated users', function () {
$user = User::factory()->create();
$user->assignRole('super_admin');
$this->actingAs($user)
->get('/admin')
->assertOk();
});لكل مصدر، اكتب اختبار Pest يُنشئ سجلاً ويتحقق من ظهوره في الجدول.
test('manager can create a product', function () {
$manager = User::factory()->create();
$manager->assignRole('manager');
$this->actingAs($manager);
Livewire::test(CreateProduct::class)
->fillForm([
'name' => 'Demo Hoodie',
'slug' => 'demo-hoodie',
'sku' => 'DEMO-1',
'price' => 49.99,
'category_id' => Category::factory()->create()->id,
])
->call('create')
->assertHasNoFormErrors();
$this->assertDatabaseHas('products', ['sku' => 'DEMO-1']);
});استكشاف الأخطاء وإصلاحها
تظهر بعض المشاكل بشكل متكرر عند نشر لوحات Filament.
طلب أول بطيء بعد النشر. شغّل filament:cache-components وview:cache كجزء من نص النشر.
فشل صامت في تحميل الملفات. تأكد من أن php.ini يحتوي على upload_max_filesize وpost_max_size مرفوعَين بدرجة كافية، وأن سياسة دلو S3 تسمح بالقراءة العامة.
مبدّل المستأجرين مفقود. تحقق من أن نموذج المستخدم ينفّذ HasTenants وأن getTenants يُرجع مجموعة غير فارغة.
الصلاحيات تبدو غير متسقة. شغّل php artisan shield:generate --all بعد كل مصدر جديد حتى تبقى السياسات متزامنة.
الخطوات التالية
لديك الآن لوحة إدارة جاهزة للإنتاج. من هنا، يمكنك توسيعها في اتجاهات عديدة.
- أضف حزمة Filament Notifications للإشعارات الفورية وقائمة جرس
- ادمج إضافة مكتبة وسائط مثل
awcodes/filament-curatorلإدارة مركزية للأصول - ابنِ صفحات مخصصة لـ KPIs التي لا ترتبط بشكل نظيف بمصدر واحد
- اربط واجهة Livewire عامة تستهلك نفس النماذج
- انقل تخزين الملفات إلى Cloudflare R2 لتسليم وسائط رخيص وسريع
إذا كنت قادماً من Next.js، فستقدّر مدى ما يمنحك إياه Filament مجاناً. إذا كنت توسع تطبيق لارافيل قائماً، فإن Filament يتكامل بجوار مساراتك دون إعادة كتابة أي شيء.
الخاتمة
في عصر واحد، بنينا لوحة إدارة كاملة بمصادر ولوحات معلومات وصلاحيات وتعدد مستأجرين. وصل Filament v3 إلى مستوى من الصقل حيث لم يعد خياراً متخصصاً — إنه الإجابة الافتراضية لعمل إدارة لارافيل في عام 2026. الجمع بين Livewire 3 وواجهة برمجة تطبيقات مكونات مدروسة ومجتمع شغوف يعني أنك تقضي وقتك على ميزات المنتج الفعلية بدلاً من تلميع الإطار حولها.
استخدم هذا الدرس كأساس، انشر نسختك الخاصة، واستكشف نظام إضافات Filament. تسرد صفحة الإضافات المجتمعية مئات الإضافات مفتوحة المصدر تغطي كل شيء من فوترة Stripe إلى تكاملات OAuth. اختر ما تحتاجه، اشحن بسرعة، ودع لوحة الإدارة تواكب منتجك.