إعدادات قابلة للتعديل من قبل المسؤول دون تعقيد الكود
تواجه التطبيقات مشكلة مستمرة. تنتمي بعض الإعدادات إلى ملف .env بينما يجب أن تتغير إعدادات أخرى عبر لوحة تحكم المسؤول دون الحاجة إلى إعادة نشر الكود (deploy). تشمل الأمثلة أسماء المواقع، أو المناطق الزمنية، أو إعدادات التسجيل.
يقوم العديد من المطورين بتخزين هذه الإعدادات في قاعدة بيانات، لكنهم يتسببون في فوضى. ينتهي بك الأمر بطريقتين لقراءة البيانات؛ حيث يستخدم جزء من تطبيقك config() بينما يستخدم جزء آخر نموذج قاعدة بيانات (database model). يؤدي هذا إلى حدوث أخطاء (bugs) حيث تكون الإعدادات غير متسقة.
يمكنك تجنب ذلك باستخدام مسار قراءة واحد. تعامل مع قاعدة البيانات كطبقة تضاف فوق الإعدادات (config) عند بدء التشغيل (boot).
إليك كيفية بناء ذلك:
• استخدم مصدراً واحداً للحقيقة (single source of truth). تحتفظ قاعدة البيانات بالقيمة، ولكن التطبيق يقرأ فقط عبر config().
• استخدم فئات محددة الأنواع (typed classes). بدلاً من المصفوفات غير المنظمة، استخدم فئات ذات أنواع صارمة. هذا يمنع الأخطاء الإملائية والأخطاء الصامتة.
• قم بتحميل الإعدادات أثناء عملية بدء التشغيل (boot process). استخدم مزود خدمة (service provider) لسحب قيم قاعدة البيانات ودمجها في مصفوفة الإعدادات (config array).
احذر من هذين الفخين التقنيين:
فخ المنطقة الزمنية (The Timezone Trap) يقوم Laravel بتعيين المنطقة الزمنية في مرحلة مبكرة من عملية بدء التشغيل. إذا قمت بتغيير قيمة الإعدادات لاحقاً، فسيظل PHP يستخدم المنطقة الزمنية القديمة. يجب عليك استدعاء
date_default_timezone_set()يدوياً لمزامنة إعداد PHP العام مع قيمة الإعدادات الجديدة.فخ التثبيت الجديد (The Fresh Install Trap) التطبيق الجديد لا يحتوي على جداول في قاعدة البيانات. إذا فشلت عملية بدء التشغيل بسبب فقدان جدول الإعدادات، فلن يعمل التطبيق. لا يمكنك تشغيل التهجيرات (migrations) إذا فشل التطبيق في بدء التشغيل. قم بتغليف منطق الإعدادات الخاص بك داخل كتلة
try/catch. يتيح ذلك للتطبيق العودة إلى القيم الافتراضية في ملف.envحتى تقوم بتشغيل التهجيرات.
نصيحة أخرى للأمان: عند تعطيل ميزة مثل التسجيل، لا تكتفِ بإخفاء الزر في واجهة المستخدم (UI). قم بإزالة الميزة من الإعدادات (config) تماماً. إذا قمت بإزالة الميزة من الإعدادات، فستختفي المسارات (routes). النموذج المخفي الذي يحتوي على نقطة نهاية (endpoint) نشطة يمثل خطراً أمنياً، بينما المسار المفقود يعيد خطأ 404.
حافظ على بساطة الكود الخاص بك. يجب ألا تعرف المتحكمات (controllers) والعروض (views) ما إذا كان الإعداد قد جاء من ملف أو من قاعدة بيانات؛ يجب أن ترى فقط config().
المصدر: https://dev.to/nasrulhazim/admin-editable-settings-without-giving-up-config-2cj0
