Filament حزمة Laravel لبناء لوحات الإدارة: الشاشات التي ينشئ فيها فريقك السجلات خلف المنتج ويعدّلها ويعتمدها ويعدّ التقارير عنها. هذه المقالة موجّهة للمطوّرين والقادة التقنيين الذين يقررون ما إذا كانوا سيستخدمونها لأداة داخلية حقيقية بمستخدمين وأدوار ولغات كثيرة. موقفنا، بعد استخدامها في مواقع محتوى ثنائية اللغة وأنظمة مكاتب خلفية، أنها الخيار الافتراضي الصحيح لمعظم أعمال الإدارة في Laravel، والأداة الخطأ لحفنة من الحالات المحددة. ومعرفة أيها أيّ منذ البداية توفّر عليك إعادة كتابة.
متى يتفوق Filament على لوحة إدارة مخصصة؟
لوحة الإدارة المخصصة تطبيق ثانٍ. تحتاج إلى مصادقة خاصة، وتخطيط، وجداول، ومرشّحات، ونماذج، ورسائل تحقق، ورفع ملفات، وإجراءات جماعية، وفحوص صلاحيات، وكل واحد منها مكان يمكن أن يختبئ فيه خطأ. يمنحك Filament كل ذلك جاهزاً فوق Livewire وTailwind، فتصبح شاشة CRUD عاملة لنموذج ما مسألة بعد ظهر لا sprint كاملاً.
يتفوق كلما كانت لوحة الإدارة وسيلة لا منتجاً. إدارة المحتوى، ومعالجة الطلبات، وأدوات الدعم، وسير عمل الاعتمادات، وإدخال بيانات المكتب الخلفي: من يستخدمون هذه الشاشات يريدونها سريعة ومتوقعة، لا مميزة.
ابنِ لوحة مخصصة بدلاً منه حين تكون الواجهة هي المنتج، أو حين لا يكون نموذج التفاعل «اعرض قائمة، رشّح، عدّل سجلاً» (مخطِّط بالسحب والإفلات، أو لوحة حية بتعاون فوري)، أو حين يجب تضمين لوحة الإدارة داخل واجهة أمامية هي أصلاً React أو Next.js ولا يُقبل وجود stack واجهة ثانية.
كيف ينبغي أن تنظّم resources والنماذج في Filament؟
الـ resource هو وحدة العمل في Filament: صنف واحد يصف الجدول والنموذج والصفحات لنموذج بيانات. أبقِ الـ resources نحيلة. مخطط النموذج وأعمدة الجدول مكانهما الـ resource؛ أما التحقق الذي يعبّر عن قواعد العمل فمكانه Form Requests أو دوال النماذج التي لديك أصلاً، حتى لا ينحرف الـ API ولوحة الإدارة عن بعضهما.
بضع عادات تؤتي ثمارها:
- سمِّ أقسام النموذج بما يفعله المحرّر لا بأعمدة قاعدة البيانات. «النشر» مع الحالة والتاريخ يُقرأ أفضل من «Meta».
- استخدم relation managers للسجلات الفرعية بدل تضمينها في نموذج الأصل. المقال مع تعليقاته شاشتان، لا شاشة واحدة طويلة.
- استخدم actions لأي شيء ليس «حفظ»: نشر، أرشفة، إعادة إرسال، تصدير. كل واحد زر مسمّى له تفويضه وتأكيده، ويبقي النموذج خالياً من تغييرات حالة خفية.
- اكتب اختباراً لكل resource يحمّل صفحة القائمة على الأقل ويرسل النموذج. يأتي Filament بمساعدات اختبار Livewire، ولوحة إدارة معطّلة يكتشفها العميل أسوأ من واحدة يكتشفها CI.
كيف تعمل الأدوار والصلاحيات في Filament؟
لا يأتي Filament بنموذج صلاحيات خاص به، وهذا قرار جيد: فهو يستخدم policies في Laravel. إن قالت PostPolicy إن المستخدم لا يجوز له الحذف، يختفي زر الحذف ويُرفض الطلب. لذا الخطوة الأولى هي نفسها في أي تطبيق Laravel: اكتب policies لكل نموذج تعرضه اللوحة.
للأدوار المسمّاة، اقرنه بـ spatie/laravel-permission وإضافة صغيرة تعرض الأدوار والصلاحيات كـ resources خاصة بها. أبقِ الأدوار قليلة والصلاحيات أفعالاً: update posts وpublish posts، لا صلاحية لكل شاشة. قيّد الوصول إلى اللوحة نفسها بعقد FilamentUser حتى لا يصل حساب عميل أبداً إلى شاشة دخول الإدارة، واستخدم لوحات منفصلة بدل لوحة واحدة عملاقة حين يحتاج جمهوران إلى تنقّل مختلف فعلاً.
لا تُخفِ التنقّل وتسمّي ذلك أماناً: فعنصر القائمة المخفي لا يزال عنوان URL يمكن الوصول إليه. الـ policies هي الإنفاذ.
كيف تتعامل مع المحتوى ثنائي اللغة في Filament؟
ينشر معظم عملائنا بالإنجليزية والعربية، لذا كل حقل قابل للترجمة في لوحاتنا تبويب لكل لغة. مع spatie/laravel-translatable وإضافة الترجمة في Filament، يصبح عمود JSON تبويباً إنجليزياً وتبويباً عربياً في النموذج نفسه، واللغة الافتراضية أولاً لأنها اللغة الاحتياطية.
ثلاثة تفاصيل أهم من اختيار الإضافة. أولاً، الاتجاه من اليمين إلى اليسار: يحتاج التبويب العربي إلى dir="rtl" على حقوله والمحرر الغني، وإلا سيصارع المحرّرون المؤشر. ثانياً، التحقق لكل لغة: العنوان المطلوب ينبغي أن يكون مطلوباً في اللغة الأساسية واختيارياً في الأخرى، وإلا تعذّر حفظ أي مسودة. ثالثاً، الحفظ الجزئي: تأكد أن حفظ تبويب واحد لا يمحو الآخر أبداً، وضع اختباراً على ذلك، لأن هذا الفشل صامت ويكتشفه زائر لا محرّر.
أين حدود Filament؟
Filament مبني على Livewire، فكل تفاعل رحلة ذهاب وإياب إلى الخادم. الشاشات ذات مئات الحقول، والجداول الضخمة بلا ترقيم صفحات من جهة الخادم، وأي شيء يحتاج إلى استجابة فورية ستبدو ثقيلة. وهو أيضاً صاحب رأي في التخطيط؛ التخصيص البصري العميق ممكن لكنه يعمل ضده، ولحظة تجد نفسك تستبدل عروض Blade لمعظم المكونات تكون قد بدأت تبني لوحة مخصصة بخطوات إضافية.
كن صادقاً بشأن الجمهور: Filament أداة ممتازة للوحة الموظفين، وملاءمة ضعيفة لبوابة تواجه المستهلكين، حيث تخدم واجهة Next.js عامة على الـ API نفسه في Laravel بشكل أفضل. وفي مشاريعنا يكون التقسيم عادةً هذا بالضبط: Filament للفريق، وNext.js لكل من عداهم، وAPI واحد تحت الاثنين.