🟠 Laravel

แยก Logic การ Validate ออกมาด้วย Laravel Form Request เพื่อ Code ที่สะอาดและดูแลรักษาง่าย

8 นาที 18 views บันทึกเป็น PDF
แยก Logic การ Validate ออกมาด้วย Laravel Form Request เพื่อ Code ที่สะอาดและดูแลรักษาง่าย

เลิกเขียน Validation ไว้ใน Controller ให้รก! เรียนรู้วิธีใช้ php artisan make:request เพื่อแยก Logic การตรวจสอบข้อมูลให้เป็นระเบียบตามมาตรฐานมืออาชีพ

ทำไมเราถึงต้องแยก 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 เป็นชื่อไฟล์ที่คุณสร้างขึ้นมาใหม่

  1. พิมพ์คำสั่ง php artisan make:request StoreUserRequest เพื่อสร้างไฟล์
  2. เข้าไปที่ app/Http/Requests/StoreUserRequest.php แล้วใส่กฎในเมธอด rules()
  3. เปลี่ยนพารามิเตอร์ใน 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 เตรียมไว้ให้ จะช่วยให้คุณไม่ต้องมานั่งปวดหัวกับโค้ดที่แก้ไขยากในภายหลัง เริ่มต้นปรับเปลี่ยนวันนี้แม้เพียงเล็กน้อย ก็ถือว่าคุณได้ก้าวข้ามขีดจำกัดของตัวเองไปอีกขั้นแล้วครับ

แชร์บทความ

Facebook X LINE

บทความที่เกี่ยวข้อง

คู่มือ Laravel Optimization และการเตรียมโปรเจกต์ขึ้น Production สำหรับมือใหม่
Laravel

คู่มือ Laravel Optimization และการเตรียมโปรเจกต์ขึ้น Production สำหรับมือใหม่

เรียนรู้วิธีทำ Laravel Optimization, การ Cache Config และ Route เพื่อเพิ่มความเร็วเว็บไซต์ พร้อมขั้นตอนการเตรียมโปรเจกต์และ Deploy ขึ้นเซิร์ฟเวอร์อย่างมืออาชีพ

1 month ago 8 นาที
26 views
สอนสร้างเว็บด้วย Laravel 13: Workshop ทำระบบ CRUD ตั้งแต่เริ่มต้นจนใช้งานได้จริง
Laravel

สอนสร้างเว็บด้วย Laravel 13: Workshop ทำระบบ CRUD ตั้งแต่เริ่มต้นจนใช้งานได้จริง

เรียนรู้การพัฒนาเว็บแอปพลิเคชันด้วย Laravel 13 ตั้งแต่การออกแบบฐานข้อมูล Migration ไปจนถึงการจัดการ Logic ด้วย MVC สำหรับมือใหม่ที่อยากเป็นโปรแกรมเมอร์มืออาชีพ

1 month ago 10 นาที
22 views
คู่มือการใช้งาน Session, Flash Messages และ Notifications ใน Laravel สำหรับมือใหม่
Laravel

คู่มือการใช้งาน Session, Flash Messages และ Notifications ใน Laravel สำหรับมือใหม่

เรียนรู้การจัดการ Session ใน Laravel ตั้งแต่พื้นฐานการเก็บข้อมูลชั่วคราว การทำ Flash Messages แจ้งเตือนผู้ใช้ ไปจนถึงการใช้ระบบ Notifications แบบมืออาชีพ

1 month ago 10 นาที
28 views