Laravel Validation การตรวจสอบข้อมูลก่อนบันทึกลงฐานข้อมูล

Founder, MyCoding.Academy
วิศวกรไฟฟ้าและโทรคมนาที่หลงไหลการเขียนโปรแกรม เลยได้ทำงานประจำช่วงหนึ่งทางด้านการพัฒนาซอฟต์แวร์ ปัจจุบันก็ยังทำงานเป็นฟรีแลนซ์ทางด้านการเขียนโปรแกรมอยู่นะครับ

สิ่งสำคัญอันหนึ่งในการเขียนโปรแกรมบนเว็บ หรือ Web Application ก็คือการตรวจสอบข้อมูลกลั่นกรองให้เป็นไปตามรูปแบบที่เราออกแบบไว้ รวมทั้งปิดกั้นข้อมูลที่อาจจะเป็นอันตรายหรือทำความเสียหายให้กับระบบโดยรวมด้วย สำหรับ Laravel Framework ส่วนนี้เรียกว่าการทำ Validation ซึ่ง Laravel ได้เตรียมพร้อมส่วนนี้ไว้ให้เราแล้ว เพราะฉะนั้นก่อนที่จะเขียนอะไรเพิ่มเพิมในส่วนนี้ต้องตรวจสอบก่อนครับว่า Laravel มีมาให้แล้วหรือยัง

ในขั้นตอนของการตรวจสอบข้อมูล จะเกิดขึ้นที่ Controller นะครับ อาจจะอยู่ในตัว Controller โดยตรงหรืออยู่ในส่วนของ Request (ขั้นสูง) ก็ได้ก็คือถ้าเราเรียกใช้ ตามรูปด้านล่างนี้

/**
* Store a new blog post.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
     $validated=$request->validate([
          'title'=>'required|unique:posts|max:255',
          'body'=>'required',
     ]);
         // The blog post is valid...save
         Post::create($validated);
         return redirect('/');
}

ถ้าผ่านการตรวจสอบตัว Controller ก็จะทำงานต่อในบรรทัดต่อไป แต่ถ้าไม่ผ่านมันจะมีกระบวนการต่อเนื่องที่เกิดขึ้นอัตโนมัติ ปกติคือ Validation Exception แล้วจะส่งข้อมูลแจ้งกลับความผิดพลาดให้ต้นทางทำการแก้ไขเพื่อส่งข้อมูลใหม่ (ในกรณี API) สำหรับเว็บจะ Redirect กลับพร้อมข้อความแสดงความผิดพลาดแสดงให้ผู้ใช้ทราบ เพราะฉะนั้นลอจิกตรงนี้สำคัญ ควรเขียนไปตามขั้นตอนนีั้และเลือกใช้วิธีการตรวจสอบข้อมูลที่เหมาะสม ถ้าคุณรู้ว่าทีมงาน Laravel เตรียมอะไรไว้ให้บ้างแล้วคุณจะร้อง ว้าว ครับ ในโค้ดด้านบนตัวแปร $validated จะเป็น array ที่เหลือเฉพาะข้อมูลที่ถูกกรองแล้ว และเราสามารถส่งให้ให้ฟังก์ชัน create() เพื่อส่งค่าและบันทึกลงฐานข้อมูลเลยทันทีครับ

สำหรับการเรียกใช้งานฟังก์ชันในการตรวจสอบข้อมูล แบบด้านบนคือส่งข้อมูลเป็นสตริง (string) โดยคั่นแต่ละตัวด้วย | แต่เราสามารถส่งข้อมูลเป็น array ก็ได้ ลองดูครับ

/**
* Store a new blog post.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
     $validated=$request->validate([
          'title'=>['required','unique:posts','max:255'],
          'body'=>['required'],
     ]);
         // The blog post is valid...save
         Post::create($validated);
         return redirect('/');
}
ในกรณีของ array จะทำให้เรามีทางเลือกมากขึ้นในการ customize ครับ เช่นการสร้างกฎใหม่ของเราเองเป็นต้น สำหรับการจะดูว่า Laravel มีอะไรให้บ้างต้องดูที่่เอกสารครับ ในที่นี้จะยกมาบางตัวครับ
 
accepted ฟิลด์จะต้องมีค่าเป็น true, on, yes หรือ 1 แสดงว่าเป็นการยอมรับเช่นการคลิกยอมรับนโยบายการใช้งานเป็นต้น
accepted_if:field,value ฟิลด์จะมีค่าเป็น true, on, yes หรือ 1 เมื่อฟิลด์ที่ระบุมีค่าตามที่กำหนด
       'accepted' => 'accepted_if:sale_id,2' จะผ่านการตรวจสอบเมื่อ sale_id = 2 และ accepted = on, true, yes หรือ 1
after:date ฟิลด์จะต้องเป็นวันที่หลังจากวันที่ระบุ อาจระบุเป็นค่าหรือฟิลด์อื่นก็ได้ครับ
       'start_date' => 'required|date|after:tomorrow'       start_date ต้องหลังจากวันพรุ่งนี้
        'finish_date' => 'required|date|after:start_date'     finish_date ต้องหลังจาก start_date
before:date ฟิลด์จะต้องเป็นวันที่ก่อนวันที่กำหนด คล้ายกับกรณีของ after       
alpha ฟิลด์ต้องเป็นตัวอักษร
alpha_num ฟิลด์เป็นตัวอักษรและตัวเลข
alpha_dash ฟิลด์เป็นตัวอักษรและขีด -, _ 
between:min:max ฟิลด์ต้องมีค่าระหว่างค่าพารามิเตอร์ min และ max
confirmed ฟิลด์ต้องมีค่าเท่ากับ {field}_confirmation เช่น
       'new_password' => 'required|confirmed'    ค่า new_password ต้องเท่ากับค่าของฟิลด์ new_password_confirmation
current_password ฟิลด์ที่กำหนดต้องเท่ากับรหัสผ่านปัจจุบัน โดยอาจจะระบุ gate เช่น api ด้วย ปกติคือ web ไม่ต้องระบุก็ได้ครับ
declined
declined_if ใช้คล้ายกับ accepted แต่ฟิลด์ต้องเป็น false, off, no หรือ 0
email ฟิลด์ต้องเป็๋น email สามารถกำหนดให้มีการตรวจสอบ domain name ด้วยก็ได้
required ฟิลด์ต้องมีค่า ไม่ใช่ null หรือว่าง
required_if:another_field,value ต้องมีค่าถ้าฟิลด์ another_filed มีค่าเท่ากับ value
unique:table,column ฟิลด์ต้องไม่ซำกับข้อมูลจากฟิลด์ column ในตาราง table 
 
ก็ยกตัวอย่างไว้แค่นี้ก่อนครับมีมากมายจริงๆ ครับ