تنظیمات قابل ویرایش توسط ادمین بدون کدنویسی پیچیده
اپلیکیشنها با یک مشکل همیشگی روبرو هستند. برخی تنظیمات باید در فایل .env باشند، در حالی که برخی دیگر باید از طریق پنل مدیریت و بدون نیاز به استقرار (deploy) مجدد کد، تغییر کنند. نمونههایی از این تنظیمات شامل نام سایت، مناطق زمانی (timezones) یا تنظیمات ثبتنام هستند.
بسیاری از توسعهدهندگان این تنظیمات را در پایگاه داده ذخیره میکنند اما باعث ایجاد آشفتگی میشوند. در نهایت با دو روش مختلف برای خواندن دادهها مواجه میشوید؛ بخشی از اپلیکیشن شما از config() استفاده میکند و بخش دیگر از یک مدل پایگاه داده (database model). این موضوع منجر به باگهایی میشود که در آنها تنظیمات با هم ناسازگار هستند.
شما میتوانید با استفاده از یک مسیر خواندن واحد، از این مشکل جلوگیری کنید. با پایگاه داده به عنوان لایهای برخورد کنید که هنگام بالا آمدن (boot) برنامه، روی تنظیمات (config) شما قرار میگیرد.
روش پیادهسازی آن به این صورت است:
• از یک منبع واحد برای حقیقت (single source of truth) استفاده کنید. مقدار در پایگاه داده ذخیره میشود، اما اپلیکیشن فقط از طریق config() آن را میخواند.
• از کلاسهای دارای تایپ (typed classes) استفاده کنید. به جای آرایههای نامنظم، از کلاسهایی با تایپهای دقیق استفاده کنید. این کار از غلطهای تایپی و خطاهای پنهان جلوگیری میکند.
• تنظیمات را در طول فرآیند بالا آمدن (boot process) بارگذاری کنید. از یک service provider برای استخراج مقادیر پایگاه داده و تزریق آنها به آرایه config استفاده کنید.
مراقب این دو تله فنی باشید:
The Timezone Trap لاراول (Laravel) منطقه زمانی را در مراحل اولیه فرآیند بالا آمدن تنظیم میکند. اگر بعداً مقدار
configرا تغییر دهید، PHP همچنان از منطقه زمانی قدیمی استفاده میکند. شما باید تابعdate_default_timezone_set()را به صورت دستی فراخوانی کنید تا تنظیمات سراسری PHP با مقدار جدیدconfigشما همگامسازی شود.The Fresh Install Trap یک اپلیکیشن جدید هیچ جدول پایگاه دادهای ندارد. اگر فرآیند بالا آمدن برنامه به دلیل نبودن جدول تنظیمات با شکست مواجه شود، اپلیکیشن اجرا نخواهد شد. اگر اپلیکیشن نتواند بالا بیاید، نمیتوانید
migrationsرا اجرا کنید. منطق تنظیمات خود را در یک بلوکtry/catchقرار دهید. این کار اجازه میدهد تا زمانی کهmigrationsرا اجرا کردهاید، اپلیکیشن به مقادیر پیشفرض.envبازگردد (fallback).
نکته دیگری برای امنیت:
هنگام غیرفعال کردن قابلیتی مانند ثبتنام، فقط دکمه را در رابط کاربری (UI) مخفی نکنید. آن قابلیت را به طور کامل از config حذف کنید. اگر قابلیت را از config حذف کنید، مسیرها (routes) نیز ناپدید میشوند. یک فرم مخفی که دارای یک endpoint فعال است، یک ریسک امنیتی محسوب میشود. اما یک مسیر (route) مفقود شده، خطای 404 برمیگرداند.
کد خود را ساده نگه دارید. کنترلرها (controllers) و ویوها (views) شما نباید بدانند که یک تنظیم از فایل آمده است یا از پایگاه داده. آنها فقط باید config() را ببینند.
Source: https://dev.to/nasrulhazim/admin-editable-settings-without-giving-up-config-2cj0
