การตั้งค่าที่แก้ไขได้โดยแอดมินโดยไม่ต้องใช้โค้ดที่ซับซ้อน
แอปพลิเคชันมักประสบปัญหาเดิมๆ อยู่เสมอ การตั้งค่าบางอย่างควรอยู่ในไฟล์ .env แต่การตั้งค่าอื่นๆ จำเป็นต้องสามารถเปลี่ยนแปลงผ่าน admin panel ได้โดยไม่ต้อง deploy โค้ดใหม่ ตัวอย่างเช่น ชื่อเว็บไซต์, เขตเวลา (timezone) หรือการตั้งค่าการลงทะเบียน
นักพัฒนาหลายคนเลือกเก็บค่าเหล่านี้ไว้ในฐานข้อมูล แต่กลับสร้างความวุ่นวายขึ้นมา คุณจะลงเอยด้วยวิธีการอ่านข้อมูลสองแบบ คือ ส่วนหนึ่งของแอปใช้ config() ในขณะที่อีกส่วนใช้ database model ซึ่งนำไปสู่บั๊กที่ทำให้การตั้งค่าไม่สอดคล้องกัน
คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยใช้เส้นทางการอ่านข้อมูลเพียงเส้นทางเดียว โดยให้มองว่าฐานข้อมูลเป็นเลเยอร์ที่วางทับลงบน config ในระหว่างกระบวนการบูต (boot process)
นี่คือวิธีการสร้างมันขึ้นมา:
• ใช้แหล่งข้อมูลความจริงหนึ่งเดียว (Single source of truth): ฐานข้อมูลเป็นผู้เก็บค่า แต่แอปพลิเคชันจะอ่านผ่าน config() เท่านั้น
• ใช้ typed classes: แทนที่จะใช้ array แบบลอยๆ ให้ใช้ class ที่มีการระบุประเภทข้อมูลที่เข้มงวด (strict types) เพื่อป้องกันการพิมพ์ผิดและข้อผิดพลาดที่ตรวจจับได้ยาก
• โหลดการตั้งค่าระหว่างกระบวนการบูต: ใช้ service provider เพื่อดึงค่าจากฐานข้อมูลและส่งเข้าไปใน config array
ระวังกับดักทางเทคนิคสองประการนี้:
กับดักเรื่องเขตเวลา (The Timezone Trap) Laravel กำหนดค่า timezone ตั้งแต่ช่วงต้นของกระบวนการบูต หากคุณเปลี่ยนค่า config ในภายหลัง PHP จะยังคงใช้ timezone เดิม คุณต้องเรียกใช้
date_default_timezone_set()ด้วยตนเองเพื่อซิงค์การตั้งค่า global ของ PHP ให้ตรงกับค่า config ใหม่ของคุณกับดักการติดตั้งใหม่ (The Fresh Install Trap) แอปพลิเคชันที่ติดตั้งใหม่จะยังไม่มีตารางในฐานข้อมูล หากกระบวนการบูตของคุณล้มเหลวเพราะหาตาราง settings ไม่เจอ แอปก็จะเริ่มทำงานไม่ได้ และคุณก็ไม่สามารถรัน migrations ได้หากแอปบูตไม่ขึ้น ให้ครอบตรรกะการตั้งค่าของคุณด้วยบล็อก try/catch เพื่อให้แอปสามารถกลับไปใช้ค่าเริ่มต้นจาก
.envได้จนกว่าคุณจะรัน migrations เสร็จสิ้น
เคล็ดลับเพิ่มเติมเพื่อความปลอดภัย: เมื่อต้องการปิดใช้งานฟีเจอร์บางอย่าง เช่น การลงทะเบียน อย่าเพียงแค่ซ่อนปุ่มใน UI แต่ให้ลบฟีเจอร์นั้นออกจาก config ไปเลย หากคุณลบฟีเจอร์ออกจาก config เส้นทาง (routes) ก็จะหายไปด้วย การมีฟอร์มที่ถูกซ่อนไว้แต่ยังมี endpoint ที่ใช้งานได้จริงถือเป็นความเสี่ยงด้านความปลอดภัย ในขณะที่เส้นทางที่หายไปจะส่งคืนค่า 404 แทน
รักษาโค้ดของคุณให้เรียบง่าย Controller และ View ของคุณไม่ควรต้องรู้ว่าการตั้งค่ามาจากไฟล์หรือฐานข้อมูล พวกมันควรจะเห็นแค่ config() เท่านั้น
Source: https://dev.to/nasrulhazim/admin-editable-settings-without-giving-up-config-2cj0
