Validation ( การตรวจสอบข้อมูล )
คือการตรวจสอบค่าต่างๆ ที่ป้อนเข้ามา หรือระหว่างการทำงานของฟังก์ชันต่างๆ โดยจะแสดงข้อผิดพลาดให้เราด้วย โดยคลาสที่ทำหน้าที่นั้นชื่อ Validator ครับ
<a name="basic-usage"></a> ## การใช้งานเบื้องต้น
การใช้งานคลาส validator
1 $validator = Validator::make(
2 array('name' => 'Dayle'),
3 array('name' => 'required|min:5')
4 );
อาเรย์ตัวแรกคือข้อมูลที่เราจะทำการตรวจนั้นเอง ตัวที่สองคือรูปแบบที่เราต้องการ การใช้เครื่องหมาย | การตรวจสอบออกเป็นหลายๆ แบบ
ใช้อาเรย์ในการกำหนดกฏ
1 $validator = Validator::make(
2 array('name' => 'Dayle'),
3 array('name' => array('required', 'min:5'))
4 );
คลาส Validator จะสร้างเมทอด ชื่อ fails (หรือ passes) เพื่อตรวจสอบผล
1 if ($validator->fails())
2 {
3 // The given data did not pass validation
4 }
ถ้าไม่ผ่านเราสามารถดึงข้อความแสดงข้อผิดพลาดได้.
1 $messages = $validator->messages();
เมทอด failed ใช้ในการเข้าถึงกฏที่เราตั้งไว้
1 $failed = $validator->failed();
<a name="working-with-error-messages"></a> ## การจัดการข้อความแสดงข้อผิดพลาด
เมื่อเรียกเมทอด messages บนตัว Validator instance,เราจะได้รับ MessageBag instance ที่จะมีเมทอดให้เราจัดการข้อความ
แสดงข้อความแสดงข้อผิดพลาดเฉพาะตัวแรก
1 echo $messages->first('email');
รับข้อความแสดงข้อผิดพลาดทั้งหมด
1 foreach ($messages->get('email') as $message)
2 {
3 //
4 }
รับข้อความแสดงข้อผิดพลาดจากทุกคอลัมน์
1 foreach ($messages->all() as $message)
2 {
3 //
4 }
ตรวจว่ามีข้อความแสดงข้อผิดพลาดจากคอลัมน์ eamil ไหม
1 if ($messages->has('email'))
2 {
3 //
4 }
รับข้อความแสดงข้อผิดพลาดโดยใส่รูปแบบให้ด้วย
1 echo $messages->first('email', '<p>:message</p>');
หมายเหตุ: โดยเริ่มต้น, รูปแบบข้อความจะถูกจัดในรูปแบบที่นำไปใช้งานร่วมกับ twiiter bootstrap ได้.
<br /><br /><br /><br /> รับข้อความแสดงข้อผิดพลาดทั้งหมดพร้อมใส่รูปแบบ
1 foreach ($messages->all('<li>:message</li>') as $message)
2 {
3 //
4 }
<a name="error-messages-and-views"></a> ## การแสดงข้อความแสดงข้อผิดพลาดบน view
ตัวอย่างนี้เราจะส่งข้อความแสดงข้อผิดพลาด ไปให้ view
1 Route::get('register', function()
2 {
3 return View::make('user.register');
4 });
5
6 Route::post('register', function()
7 {
8 $rules = array(...);
9
10 $validator = Validator::make(Input::all(), $rules);
11
12 if ($validator->fails())
13 {
14 return Redirect::to('register')->withErrors($validator);
15 }
16 });
ถ้าการตรวจสอบไม่ผ่านเราจะใช้เมทอด withErrors ส่งข้อความแสดงข้อผิดพลาด
ขึ้นไปบน View ด้วย
ไม่ควรส่งข้อความแสดงข้อผิดพลาด ไปบน Route ทีเป็น method GET เพราะ laravel จะตรวจสอบข้อผิดพลาดบน session ทุกคำร้องขอ
เมื่อทำการรีไดเรคเราสามารถเข้าถึงข้อความแสดงข้อผิดพลาด โดยใชตัวแปร$errors ดังตัวอย่างครับ
1 <?php echo $errors->first('email'); ?>
<br /><br /><br /><br /> <a name="available-validation-rules"></a> ## กฏในการตรวจสอบที่ laravel เตรียมไว้
<a name="rule-accepted"></a> #### accepted
ค่าทีจะผ่านคือ yes, on, or 1.เหมาะสำหรับใช้ในการตรวจสอบว่ายอมรับ “Terms of Service” ไหม
<a name="rule-active-url"></a> #### active_url
ตรวจสอบว่าลิ้งตายยัง โดยใช้ checkdnsrr ซึ่งเป็น PHP function.
<a name="rule-after"></a> #### after:date
ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาหลักจากใช้ strtotime อยู่หลังสุดแปลงไหม
<a name="rule-alpha"></a> #### alpha
ตรวจสอบว่าค่าที่ส่งมาเป็นรูปแบบของตัวอักษรต่างๆ ไหม
<a name="rule-alpha-dash"></a> #### alpha_dash
ตรวจสอบว่าค่าที่ส่งมาเป็นรูปแบบของตัวเลขที่มีเครื่องหมาย _ รวมอยู่ด้วยไหม
<a name="rule-alpha-num"></a> #### alpha_num
ตรวจสอบว่าค่าที่ส่งมาเป็นรูปแบบของตัวเลขไหม
<a name="rule-before"></a> #### before:date
ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาหลักจากใช้ strtotime อยู่หน้าสุดไหม
<a name="rule-between"></a> #### between:min,max
ตรวจสอบว่าค่าที่ส่งมาเป็นมีค่าอยู่ระหว่าง min กับ max ไหม
<a name="rule-confirmed"></a> #### confirmed
ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของฟอร์มที่มีรูปแบบ ชื่อ_confirmation ยกตัวอย่างการ
ตรวจสอบ password,ว่าตรงกับpassword_confirmation ไหม
<a name="rule-date"></a> #### date
ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาหลักจากใช้ strtotime ไหม.
<a name="rule-date-format"></a> #### date_format:format
ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของเวลาที่กำหนดไหม
<a name="rule-different"></a> #### different:field
ค่าตรง field ต้องมีค่าต่างจากค่าที่ป้อนเข้ามาถึงจะผ่าน
<a name="rule-email"></a> #### email
ตรวจสอบว่าค่าที่ส่งมาเป็นมีรูปแบบของ email
<a name="rule-exists"></a> #### exists:table,column
ฟอร์มที่อยู่ในการตรวจสอบต้องมีชื่อตรงกับคอลัมน์ในฐานข้อมูล
การใช้งานเบื้องต้น
1 'state' => 'exists:states'
การใช้งานโดยใส่ค่าที่ต้องการตรวจไปหลายค่า
1 'state' => 'exists:states,abbreviation'
เราสามารถกำหนดเงื่อนไขให้กฏคล้ายๆการทำคิวรี้ ครับ
1 'email' => 'exists:staff,email,account_id,1'
<a name="rule-image"></a> #### image
ตรวจสอบว่าค่าที่ส่งมาเป็นรูปภาพมีนามสกุล(jpeg, png, bmp, or gif) ไหม
<a name="rule-in"></a> #### in:foo,bar,…
ตรวจสอบว่าค่าที่ส่งมามีค่าตรงกับค่าใน foo,bar ไหม
<a name="rule-integer"></a> #### integer
ตรวจสอบว่าค่าที่ส่งมามีรูปแบบของเลขจำนวนเต็มไหม
<a name="rule-ip"></a> #### ip
ตรวจสอบว่าค่าที่ส่งมามีรูปแบบของ IP address.
<a name="rule-max"></a> #### max:value
ตรวจสอบว่าค่าที่ส่งมามีค่าน้อยกว่าค่าที่กำหนดไว้
<a name="rule-mimes"></a> #### mimes:foo,bar,…
ตรวจสอบว่าค่าที่ส่งมามีรูปแบบของ mime type ตรงกับที่กำหนดไหม
ตัวอย่างการตรวจสอบนามสกุลของไฟล์
1 'photo' => 'mimes:jpeg,bmp,png'
<a name="rule-min"></a> #### min:value
ตรวจสอบว่าค่าที่ส่งมามีจำนวนน้อยกว่าไหมถ้ามีน้อยกว่าก็ไม่ผ่าน
<a name="rule-not-in"></a> #### not_in:foo,bar,…
ตรวจสอบว่าค่าที่ส่งมามีค่าตรงกับค่าที่ตั้งไว้ไหม ถ้ามีก็ไม่ผ่านครับ
<a name="rule-numeric"></a> #### numeric
ตรวจสอบว่าค่าที่ส่งมาเป็นตัวเลขไหม
<a name="rule-regex"></a> #### regex:pattern
ตรวจสอบว่าค่าที่ส่งมามีรูปแบบกับ regular expression ที่กำหนดไว้ไหม
<a name="rule-required"></a> #### required
ตรวจสอบว่าค่าที่ส่งมาเป็นค่าว่างไหม ถ้าเป็นก็ไม่ผ่านครับ <br /><br /><br /> <a name="rule-required-if"></a> #### required_if:field,value
ตรวจว่าค่าใน field ต้องไม่ว่างและ ตรงกับ value
<a name="rule-required-with"></a> #### required_with:foo,bar,…
ตรวจว่าฟิล foo ต้องมีค่าหาก bar มีค่าด้วย
<a name="rule-required-without"></a> #### required_without:foo,bar,…
ตรวจว่าฟิล foo ต้องมีค่าหาก bar ไม่มีค่า
<a name="rule-same"></a> #### same:field
ตรวจว่าค่าที่ส่งเข้ามาซ้ำกับค่าที่กำหนดไว้ไหม
<a name="rule-size"></a> #### size:value
ตรวจว่าค่าที่ส่งเข้ามาตรงกับที่กำหนดไว้ไหม กรณีเป็นคำจะตรวจสอบจำนวนคำ เป็นตัวเลขก็เทียบตามค่า เป็ไฟล์เทียบตามขนาดของไฟล์เป็นกิโลไบต์
<a name="rule-unique"></a> #### unique:table,column,except,idColumn
ตรวจว่าค่าที่ส่งมาซ้ำกับในตารางไหม.
ตัวอย่างการใช้ตรวจว่าอีเมล์นี้มีในตาราง user ไหม
1 'email' => 'unique:users'
ตัวอย่างการใช้ตรวจว่าอีเมล์นี้มีในตาราง user ตรงคอลัมน์ email-address ไหม
1 'email' => 'unique:users,email_address'
ตัวอย่างการใช้ตรวจว่าอีเมล์นี้มีในตาราง user ตรงคอลัมน์ email-address ไหม โดยไม่สนใจ id ที่มีค่าเท่ากับ 10
1 'email' => 'unique:users,email_address,10'
<a name="rule-url"></a> #### url ตรวจว่าค่าเป็น url ไหม
<br /><br /> <a name="custom-error-messages"></a> ## การกำหนดข้อความแสดงข้อผิดพลาดเอง
เราสามารถปรับแต่งข้อความที่แสดงข้อผิดพลาดได้
ตัวอย่าง
1 $messages = array(
2 'required' => 'The :attribute field is required.',
3 );
4
5 $validator = Validator::make($input, $rules, $messages);
การใช้ข้อความที่เรากำหนดร่วมกับ Place-Holders
1 $messages = array(
2 'same' => 'The :attribute and :other must match.',
3 'size' => 'The :attribute must be exactly :size.',
4 'between' => 'The :attribute must be between :min - :max.',
5 'in' => 'The :attribute must be one of the following types: :values',
6 );
กำหนดข้อความให้แต่ละคอลัมน์เลย
1 $messages = array(
2 'email.required' => 'We need to know your e-mail address!',
3 );
บางกรณีเราต้องการกำหนดข้อความที่แสดงให้เป็นเฉพาะแต่ละภาษาไป ซึ่งเราต้องไปเพิ่มที่อาเรย์ชื่อ custom ใน app/lang/xx/validation.php ตาม
ภาษาที่ไป
คัวอย่าง
1 'custom' => array(
2 'email' => array(
3 'required' => 'We need to know your e-mail address!',
4 ),
5 ),
<br /><br /> <a name="custom-validation-rules"></a> ## การสร้างตัวตรวจสอบ
เราสามารถสร้างฟังก์ชันในการตรวจสอบได้เองโดย laravel เตรียมเมทอด Validator::extend มาเพื่อการนั้นครับ
ตัวอย่าง
1 Validator::extend('foo', function($attribute, $value, $parameters)
2 {
3 return $value == 'foo';
4 });
ตัวอย่างข้างบนเรารับตัวแปรมาสามตัวครับ $attribute คือชื่อข้อมูลที่จะตรวจ $value ค่าของข้อมูล $parameters ค่าอื่นๆ
You may also pass a class and method to the extend method instead of a Closure:
1 Validator::extend('foo', 'FooValidator@validate');
มีอีกวิธีในการสร้างคลาสของเราเองโดยการสืบทอด Illuminate\Validation\Validator ทีนี้ฟังก์ชันต้องมีคำว่า validateนำหน้าด้วยนะครับ
ตัวอย่าง
1 <?php
2
3 class CustomValidator extends Illuminate\Validation\Validator {
4
5 public function validateFoo($attribute, $value, $parameters)
6 {
7 return $value == 'foo';
8 }
9
10 }
<br /><br /><br /><br /> ต่อมาเราต้องเอาคลาสของเรามาลงทะเบียน
1 Validator::resolver(function($translator, $data, $rules, $messages)
2 {
3 return new CustomValidator($translator, $data, $rules, $messages);
4 });
เราสามารถสร้างเมทอดที่ใช้ในการแสดงข้อผิดพลาดโดยตามรูปแบบนี้ครับ replaceXXX ตามตัวอย่าง
1 protected function replaceFoo($message, $attribute, $rule, $parameters)
2 {
3 return str_replace(':foo', $parameters[0], $message);
4 }