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 }