ทำไมเราถึงต้องแยก Logic การ Validate ออกมา?
เมื่อเราเริ่มเขียนเว็บแอปพลิเคชันด้วย Laravel สิ่งแรกที่ต้องเจอคือการรับข้อมูลจากผู้ใช้ผ่านฟอร์ม แต่ปัญหาที่มือใหม่มักเจอคือการเขียนคำสั่งตรวจสอบข้อมูล (Validation) ปนไปกับคำสั่งการทำงานหลักใน Controller ซึ่งเราเรียกสภาวะนี้ว่า Spaghetti Code (โค้ดที่พันกันยุ่งเหยิงเหมือนเส้นสปาเกตตี) เพราะเมื่อโปรเจกต์ใหญ่ขึ้น ไฟล์ Controller ของคุณจะยาวเป็นหางว่าวและดูแลยากมาก
ลองนึกภาพว่าคุณกำลังทำร้านอาหาร แทนที่จะให้เชฟ (Controller) ทำหน้าที่ทั้งปรุงอาหาร ล้างจาน และรับออเดอร์เอง คุณควรมีพนักงานต้อนรับ (Request Class) คอยตรวจสอบว่าลูกค้าจองโต๊ะมาจริงไหมหรือสั่งเมนูที่มีในร้านหรือเปล่า หากข้อมูลไม่ถูกต้อง พนักงานก็ปฏิเสธตั้งแต่หน้าร้านโดยที่เชฟไม่ต้องเสียเวลาลงมือทำ การแยกหน้าที่แบบนี้ช่วยให้โค้ดของคุณสะอาดและเป็นระเบียบตามหลักการของ Single Responsibility Principle (หลักการที่ว่าหนึ่งคลาสควรมีหน้าที่เดียว)
การใช้ php artisan make:request จึงเป็นทางออกที่ดีที่สุด เพราะเป็นการสร้างไฟล์แยกออกมาเพื่อจัดการเรื่องการตรวจสอบข้อมูลโดยเฉพาะ ทำให้ Controller ของคุณเหลือเพียงหน้าที่เดียวคือการเรียกใช้ข้อมูลที่ผ่านการกรองมาแล้วอย่างดีแล้วนำไปประมวลผลต่อ ซึ่งนี่คือจุดเริ่มต้นของการเขียนโค้ดระดับมืออาชีพที่บริษัทซอฟต์แวร์ชั้นนำทั่วโลกเลือกใช้
เปรียบเทียบ: เขียน Validation ใน Controller vs ใช้ Form Request
ถ้าคุณเขียนแบบเดิมใน Controller คุณจะเห็นโค้ดที่ดูรกและซ้ำซ้อน เพราะต้องเขียนคำสั่ง $request->validate([...]) ไว้ด้านบนของทุกเมธอดที่ต้องการรับข้อมูล หากวันหนึ่งคุณต้องการเปลี่ยนกฎการตรวจสอบ เช่น เพิ่มความยาวของรหัสผ่าน คุณต้องไล่ตามแก้ทุกจุดที่เขียนไว้ ซึ่งเสี่ยงต่อการเกิดบั๊กหรือการลืมแก้ไขในบางหน้า
ในทางกลับกัน การใช้ Form Request จะช่วยให้คุณแยกกฎเหล่านี้ออกมาเป็นไฟล์เฉพาะ เมื่อไหร่ที่ต้องการแก้ไขกฎ คุณก็แค่เปิดไฟล์นั้นไฟล์เดียวขึ้นมาแก้ ทุกจุดที่เรียกใช้ Request นี้จะอัปเดตตามโดยอัตโนมัติ มันเหมือนกับการที่คุณมีพิมพ์เขียวบ้านชุดเดียว ถ้าจะแก้โครงสร้างบ้าน ก็แค่แก้ที่พิมพ์เขียว ไม่ต้องไปทุบกำแพงบ้านทีละหลังด้วยตัวเอง
นี่คือตัวอย่างความแตกต่างของการเขียนโค้ดที่คุณจะพบได้บ่อยในโปรเจกต์จริง:
// แบบเดิม: เขียนใน Controller (ไม่แนะนำ)
public function store(Request $request) {
$validated = $request->validate([
'email' => 'required|email',
'password' => 'required|min:8',
]);
// ทำงานต่อ...
}
// แบบใหม่: ใช้ Form Request (แนะนำ)
public function store(StoreUserRequest $request) {
// Controller สะอาดขึ้นมาก เพราะข้อมูลถูกกรองมาแล้ว
$validated = $request->validated();
}
ขั้นตอนการสร้างและใช้งาน Form Request
การเริ่มต้นใช้งานเครื่องมือนี้ทำได้ง่ายมากผ่าน Terminal (หน้าต่างพิมพ์คำสั่ง) ในเครื่องของคุณ เพียงแค่พิมพ์คำสั่ง php artisan make:request StoreUserRequest ระบบก็จะสร้างไฟล์ขึ้นมาให้ที่โฟลเดอร์ app/Http/Requests/ โดยอัตโนมัติ ซึ่งไฟล์นี้จะมีโครงสร้างพื้นฐานพร้อมให้คุณใส่กฎเกณฑ์ต่างๆ ลงไปได้ทันที
หลังจากสร้างไฟล์แล้ว คุณต้องเข้าไปตั้งค่าในไฟล์นั้น 2 ส่วนหลัก คือ authorize() เพื่อตรวจสอบสิทธิ์ของผู้ใช้ว่าอนุญาตให้ส่งข้อมูลนี้หรือไม่ และ rules() เพื่อกำหนดกฎเกณฑ์ของข้อมูล เช่น required (ต้องใส่) หรือ unique (ห้ามซ้ำ) เมื่อตั้งค่าเสร็จแล้ว คุณก็เพียงแค่เปลี่ยนชื่อ Class ใน Controller จาก Request เป็นชื่อไฟล์ที่คุณสร้างขึ้นมาใหม่
- พิมพ์คำสั่ง
php artisan make:request StoreUserRequestเพื่อสร้างไฟล์ - เข้าไปที่
app/Http/Requests/StoreUserRequest.phpแล้วใส่กฎในเมธอดrules() - เปลี่ยนพารามิเตอร์ใน Controller จาก
Requestเป็นStoreUserRequest
ผลลัพธ์ที่ได้คือ เมื่อมีการส่งข้อมูลเข้ามา Laravel จะตรวจสอบกฎในไฟล์ StoreUserRequest ให้คุณก่อนที่โค้ดใน Controller จะทำงาน หากข้อมูลผิดพลาด ระบบจะส่งผู้ใช้กลับไปยังหน้าเดิมพร้อมข้อความแจ้งเตือนอัตโนมัติ โดยที่คุณไม่ต้องเขียนโค้ดตรวจสอบเงื่อนไข if-else เองแม้แต่บรรทัดเดียว
เจาะลึกโครงสร้างไฟล์ Request ที่สร้างขึ้น
เมื่อเปิดไฟล์ StoreUserRequest.php ขึ้นมา คุณจะเห็นเมธอด authorize() ซึ่งปกติมือใหม่มักจะให้คืนค่าเป็น true ไปก่อนเพื่ออนุญาตให้ทุกคนส่งข้อมูลได้ แต่ถ้าวันหนึ่งคุณทำระบบ Admin คุณสามารถเขียนเงื่อนไขตรวจสอบว่าผู้ใช้คนนั้นเป็นแอดมินจริงไหมได้ที่นี่ ซึ่งเป็นการเพิ่มความปลอดภัยให้แอปพลิเคชันของคุณอีกชั้นหนึ่ง
ถัดมาคือเมธอด rules() ที่คุณจะใส่กฎการตรวจสอบต่างๆ ลงไป เช่น 'username' => 'required|string|max:255' ซึ่งหมายความว่าช่องนี้ห้ามว่าง ต้องเป็นข้อความ และมีความยาวไม่เกิน 255 ตัวอักษร การเขียนกฎแบบนี้ทำให้อ่านง่ายและเข้าใจทันทีว่าข้อมูลที่เข้ามาต้องมีหน้าตาเป็นอย่างไร นี่คือหัวใจสำคัญของการเขียนโค้ดที่คนอื่นมาอ่านต่อได้เข้าใจ
นอกจากนี้ คุณยังสามารถเพิ่มเมธอด messages() เพื่อปรับแต่งข้อความแจ้งเตือนให้เป็นภาษาไทยหรือภาษาที่เข้าใจง่ายขึ้นได้ด้วย เช่น แทนที่จะให้ระบบโชว์ว่า "The email field is required." คุณก็สามารถกำหนดให้แสดงว่า "กรุณากรอกอีเมลด้วยครับ" ซึ่งช่วยให้ประสบการณ์ผู้ใช้ (UX) ดีขึ้นอย่างมาก
// ตัวอย่างการกำหนดข้อความแจ้งเตือนเอง
public function messages() {
return [
'email.required' => 'กรุณากรอกอีเมลของคุณก่อนนะครับ',
'password.min' => 'รหัสผ่านต้องมีความยาวอย่างน้อย 8 ตัวอักษร',
];
}
จุดที่มือใหม่มักพลาดและวิธีแก้ไข
ความผิดพลาดที่พบบ่อยที่สุดคือการลืม use ไฟล์ Request ที่สร้างขึ้นไว้ที่ส่วนหัวของ Controller ทำให้โปรแกรมหาไฟล์ไม่เจอและขึ้น Error ว่า "Class not found" อย่าลืมตรวจเช็คบรรทัด use App\Http\Requests\StoreUserRequest; ทุกครั้งที่ทำการเปลี่ยนชื่อ Class ในเมธอด
อีกจุดหนึ่งคือการเข้าใจผิดว่า authorize() คือที่สำหรับเช็คข้อมูล ซึ่งจริงๆ แล้วมันคือที่เช็ค สิทธิ์การใช้งาน เท่านั้น ถ้าคุณต้องการเช็คข้อมูลที่ผู้ใช้กรอกเข้ามา ให้ทำใน rules() เท่านั้น การแยกหน้าที่ของเมธอดให้ชัดเจนจะช่วยลดความสับสนและทำให้คุณจัดการกับ Logic ของแอปพลิเคชันได้แม่นยำขึ้นในระยะยาว
สุดท้ายคืออย่าลืมว่า การตรวจสอบข้อมูลเป็นเพียงด่านแรก ของความปลอดภัย แม้จะใช้ Form Request แล้ว คุณก็ยังต้องให้ความสำคัญกับการทำ Sanitization (การทำความสะอาดข้อมูลเพื่อป้องกันการโจมตี) หรือการใช้ Database Transactions หากมีการบันทึกข้อมูลหลายตารางพร้อมกัน เพื่อให้มั่นใจว่าข้อมูลในระบบของคุณจะถูกต้องและปลอดภัยที่สุด
สรุป: เปลี่ยนแนวคิดเพื่อก้าวสู่โปรแกรมเมอร์มืออาชีพ
การแยก Logic ด้วย php artisan make:request ไม่ใช่เรื่องของความสวยงามเพียงอย่างเดียว แต่เป็นเรื่องของ Scalability (การรองรับการขยายตัวของระบบในอนาคต) เมื่อคุณเริ่มทำโปรเจกต์ที่ซับซ้อนขึ้น การมีโค้ดที่แยกส่วนกันชัดเจนจะทำให้คุณทำงานร่วมกับทีมได้ง่ายขึ้น และลดเวลาในการแก้บั๊กไปได้มหาศาล เพราะทุกอย่างมีที่อยู่ของมันอย่างเป็นระเบียบ
สมมติว่าคุณกำลังทำระบบสมัครสมาชิก ถ้าคุณเขียนทุกอย่างไว้ใน Controller เพียงไฟล์เดียว วันที่คุณต้องเพิ่มฟิลด์ "เบอร์โทรศัพท์" หรือ "ที่อยู่" คุณจะต้องไล่แก้โค้ดหลายจุดจนอาจพลาดลืมตรวจสอบบางเงื่อนไข แต่ด้วย Form Request คุณแค่เปิดไฟล์เดียว เพิ่มกฎลงไปเพียงบรรทัดเดียว ระบบก็พร้อมทำงานทันที นี่คือตัวอย่างของการพัฒนาตัวเองให้คิดอย่างเป็นระบบแบบโปรแกรมเมอร์มืออาชีพ
ขอให้มองว่าการเขียนโค้ดที่ดีคือการลงทุนกับเวลาของตัวเองในอนาคต การสละเวลาเรียนรู้และใช้งานเครื่องมือที่ Laravel เตรียมไว้ให้ จะช่วยให้คุณไม่ต้องมานั่งปวดหัวกับโค้ดที่แก้ไขยากในภายหลัง เริ่มต้นปรับเปลี่ยนวันนี้แม้เพียงเล็กน้อย ก็ถือว่าคุณได้ก้าวข้ามขีดจำกัดของตัวเองไปอีกขั้นแล้วครับ