ตรวจสอบความถูกต้องข้อมูล Data Validation ใน CodeIgniter 4

บทความ เมื่อไม่กี่สัปดาห์ โดย Ninenik Narkdee
validation data codeigniter codeigniter 4

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ validation data codeigniter codeigniter 4



เนื้อหาตอนต่อไปนี้ เราจะมาพูดถึงการตรวจสอบความ
ถูกต้องของข้อมูล หรือที่เรียกกันว่า Data Validation ในที่นี้
จะขอใช้คำว่า validated data  โดยส่วนใหญ่ข้อมุลที่ใช้ตรวจสอบ
ก็จะเป็นค่าจากฟอร์มที่ส่งโดยผู้ใช้ 
    เราเคยมีเนื้อหาเกี่ยวกับการ validated data มาบ้างแล้วอย่างเช่น
ในตัวอย่างการทำ CRUD ที่ใช้งานการ validated ผ่าน Controller โดยใช้
คำสั่ง $this->validate() สามารถทบทวนเป็นแนวทางได้ที่บทความ
    สร้างระบบ CRUD เพื่อศึกษาฟังก์ชั่นของ Model ใน CodeIgniter 4 http://niik.in/995 
 
    นอกจากนั้นก็มีส่วนของการ validated data โดยใช้งานผ่าน Model สามารถ
ทบทวนได้ที่บทความ
    รู้จักกับ Model และวิธีการใช้งาน Model ใน CodeIgniter 4 http://niik.in/1004 
 
    สำหรับการ validated data ในเนื้อหานี้จะพูดถึงโดยรวมการใช้งาน ไม่ว่าจะเป็นการกำหนด rule
การกำหนด error message การกำหนด template และการใช้งานการ validated data
    ในการ validated data หากไม่ผ่าน  สิ่งที่เราจะได้รับกลับมาคือข้อความ error ของฟิลด์ข้อมูลที่ไม่ผ่าน
rule หลักเกณฑ์การตรวจสอบ เราสามารถนำไปแสดงในฟอร์มข้อมูลได้ เพื่อแจ้งเตือนได้
    การนำข้อความ error ที่ได้จากการตรวจสอบมาแสดง ก็สามารถเลือกแสดงในลักษณะ 2 รูปแบบ คือ
แสดงเป็นลิสรายการ ด้านบนของฟอร์ม หรือ แสดงใกล้ๆ กับฟิลด์ข้อมูลนั้นๆ ที่มี error เกิดขึ้น  
 
 
 

เตรียมส่วนของไฟล์ทดสอบ

    ให้เราเตรียมส่วนของไฟล์ทดสอบตามรูปแบบดังนี้
 
    app/Controllers/Helloworld.php
 
<?php namespace App\Controllers; 
use CodeIgniter\Controller; // เรียกใช้งาน Controller class
class Helloworld extends Controller 
{
    public function index() 
    {  
        helper('form'); // ใช้งาน form helper ฟังก์ชั่น
        $data = [
            'title' => 'test validated data'
        ];
        echo view('pages/myform', $data);
    }
}
 
    สำหรับส่วนของ Views ที่แสดงผลลัพธ์ประกอบการอธิบาย เรามีการใช้งาน CSS Bootstrap ร่วมด้วย
 
    app/Views/pages/myform.php
 
<!doctype html>
	<html lang="th">
	<head>
	<meta charset="utf-8">
	<title><?= esc($title) ?></title>
	<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" 
	integrity="sha384-JcKb8q3iqJ61gNV9KGb8thSsNjpSL0n8PARn9HuZOnIxN0hoP+VmmDGMN5t9UJ0Z" 
	crossorigin="anonymous">
	</head>
<body>
 
<!--     ส่วนของข้อมูลฟอร์ม ที่เราจะเพิ่ม-->
<?= form_open('helloworld') ?>
<input type="hidden" name="email" value="">
<input type="hidden" name="password" value="">
<button type="submit">Login</button>
<?= form_close() ?>
 
<!--     สร้างลิ้งค์สำหรับรีโหลดหน้าทดสอบ-->
<?= anchor(current_url(),'Reload','class="btn btn-primary btn-sm"') ?>
         
    </body>
</html>
 
    สังเกตว่าในฟอร์มตัวอย่าง เราทดสอบโดยการกำหนด input hidden สำหรับข้อมูลที่จะส่งทดสอบ
การทำงานโดยไม่มีการกำหนดค่า หรือให้เป็นค่าว่าง จำไว้เสมอว่า ค่าที่สำคัญสำหรับการใช้งานฟอร์มคือ
name attribute จะเป็นค่าหลักที่ใช้งานกับ server side script (PHP)
    ตอนนี้เราเตรียมส่วนสำหรับทดสอบ ประกอบการอธิบายเรียบร้อยแล้ว ไปต่อที่หัวข้อถัดไป
 
 
 

การใช้งาน Data Validation

    เราจะมาดูการ validated data โดยจะจำลองข้อมูลในฟอร์มด้วย hidden ที่กำหนดใน views 
สำหรับใช้งาน data validation แล้วดูผลลัพธ์ และรูปแบบการทำงาน ก่อนอื่นต้องย้ำอีกครั้งว่า การ validated 
data ใน CI จะทำได้เบื้องต้นผ่าน 2 รูปแบบ คือ ผ่าน Model ซึ่งจะทำงานอัตโนมัติ เมื่อใช้คำสั่ง insert() 
update() และ save()  นั่นคือเมื่อเราเรียกคำสั่งเหล่านี้ ตัวข้อมูลจะถูก validated  ให้อัตโนมัติตามที่เรากำหนด
ในการตรวจสอบก็จะเช็คว่า การทำคำสั่งทั้ง 3 ( insert() update() และ save() ) นั้นทำงานสำเร็จหรือไม่ 
ดูตัวอย่างการทำงาน เพิ่อทบทวน กรณีการเรียก ใช้งานผ่าน model 
 
if ($this->model->save($data) === false)
{
    return view('pages/myform', ['errors' => $this->model->errors()]);
}
  
    จะเห็นวาคำสั่ง save() ข้างบน เป็นการใช้งานผ่าน method ของ model หากทำการบันทึกไม่ผ่าน 
จะหมายถึง ไม่ผ่านการ validated data อัตโนมัติด้วย เราก็สามารถส่งค่า error จากคำสั่ง 
$this->model->errors() ไปแสดงค่า แจ้ง error ใน views ผ่านตัวแปร 'errors' ตามตัวอย่างด้านบน
    
    กรณีเราใช้งานผ่าน Model แต่ต้องการกำหนด rule เฉพาะส่วนการใช้งานนั้นๆ เอง โดยใช้คำสั่ง 
setValidationRules() ก็จะมีรูปแบบประมาณนี้
 
    app/Controllers/Helloworld.php (บางส่วน)
 
$validationRules = [
    'username' => 'required|alpha_numeric_space|min_length[3]',
    'email' => [
        'rules'  => 'required|valid_email|is_unique[users.email]',
        'errors' => [
            'required' => 'We really need your email.',
        ],
    ],
];
$this->model->setValidationRules($validationRules);
if ($this->model->save($data) === false)
{
    return view('pages/myform', ['errors' => $this->model->errors()]);
}
  
   เนื้อหาเกี่ยวกับส่วนนี้ทบทวนได้ที่บทความเกี่ยวกับ model เพิ่มเติม http://niik.in/1004
 
 

    การใช้งาน Data Validation ใน Controller

    ต่อไปมาดูกรณีที่เป็นการใช้งานการ validated data โดยใช้งาน Controller โดยตรงผ่านคำสั่ง validate()
จะมีรูปแบบประมาณนี้
 
helper('form'); // ใช้งาน form helper ฟังก์ชั่น
$data = [
	'title' => 'test validated data'
];		
if(! $this->validate([
	'email' => 'required',
	'password' => 'required',
])){
	$data['validation'] = $this->validator;
}					
echo view('pages/myform', $data);
 
    เนื่องจากใน Controller เราสามารถใช้งาน Validation instance ผ่านคำสั่ง $this->validator และทำการ
validated ข้อมูลผ่านคำสั่ง $this->validate() ได้เลย โดยไม่ต้องโหลดตัว Valiation class มาใช้งาน แต่ถ้า
เราใช้งานใน class อื่นๆ ที่ไม่ใช่ Controller เราสามารถโหลด validation class ผ่านคำสั่งดังต่อไปนี้ได้
 
// $validation =  \Config\Services::validation();
// หรือ
$validation = service('validation');
 
    แต่ใน Controller เราข้ามส่วนนี้ไปได้เลย
 
    กลับมาต่อที่โค้ด
    ตัวอย่างข้างต้น เรากำหนด validated ตั้งแต่ที่ฟอร์มถูกโหลด โดยมี rule กำหนดให้ต้องมีข้อมูลจากฟิลด์ 
email และ password คำสั่ง $this->validate() จะคืนค่าเป็น boolean (true / false ) เราใช้เงื่อนไขว่า 
ถ้าไม่ผ่านการ validated ให้ทำการส่งค่า Validation instance ด้วยคำสั่ง $this->validator ผ่านตัวแปร 
validation ไปใช้งานในฟอร์ม 
    ต่อไปส่วนของฟอร์มเราก็จะแสดงข้อมูลการใช้งานดังนี้
 
    app/Views/pages/myform.php (บางส่วน)
 
<?= (isset($validation))?$validation->listErrors():NULL ?>

<!--     ส่วนของข้อมูลฟอร์ม ที่เราจะเพิ่ม-->
<?= form_open('helloworld') ?>
<input type="hidden" name="email" value="">
<input type="hidden" name="password" value="">
<button type="submit">Login</button>
<?= form_close() ?>
 
    เราใช้คำสั่ง $validation->listErrors() เพื่อแสดงลิสรายการ errors ที่เกิดขึ้นกรณีไม่ผ่านการ validated
และเนื่องจาก เมื่อเราโหลดฟอร์มครั้งแรก เรากำหนดให้ทำการ validated ข้อมูลเลย ก็จะได้ผลลัพธ์ประมาณนี้
 
 

 
 
    โครงสร้าง template ของ CI ที่แสดงแจ้งเตือน จะเป็นดังนี้
 
<div class="errors" role="alert">
	<ul>
				<li>The email field is required.</li>
				<li>The password field is required.</li>
			</ul>
</div>
 
    รูปแบบโครงสร้าง HTML สำหรับการแจ้งเตือนข้างต้น เป็นค่าที่ใช้จาก template ของ CI ที่มีมาให้  
เนื้อหาสำหรับกำหนด template หรือรูปแบบการแสดงจะนำเสนอในหัวข้อในลำด้บต่อไป
 
    การส่ง validation instance เข้ามาใช้งานในฟอร์ม ทำให้เราสามารถเรียกใช้คำสั่งต่างๆ ของ validation 
ได้อย่างข้างต้นเราใช้คำสั่ง listErrors() เพื่อแสดงลิสรายการแจ้งเตือนทั้งหมดในรูปแบบที่ CI กำหนดให้ 
 
    เราสามารถแสดงเฉพาะรายการด้วยคำสั่ง showError() ตัวอย่างเช่นอยากแสดงตำแหน่งของฟิลด์ข้อมูลนั้น
 
<input type="hidden" name="email" value="">
<?= (isset($validation))?$validation->showError('email'):NULL ?>
<input type="hidden" name="password" value="">
<?= (isset($validation))?$validation->showError('password'):NULL ?>
<button type="submit">Login</button>
 
    ผลลัพธ์ที่ได้
 
 

 
 
    โครงสร้าง HTML ของ CI ใช้รูปแบบ template ในรูปแบบประมาณนี้
 
<input type="hidden" name="email" value="">
<span class="help-block">The email field is required.</span>
<input type="hidden" name="password" value="">
<span class="help-block">The password field is required.</span>
<button type="submit">Login</button>
 
    ทั้งคำสั่งแสดงการแจ้งเตือนแบบลิสรายการ listErrors() และแบบแสดงแต่ละรายการ showError() 
รองรับการกำหนด template ดังนี้
    listErrors() จะกำหนดเป็น parameter แรก ชื่อ template ที่เป็นค่าเริ่มต้นคือ 'list' นั่นคือ listErrors()
มีค่าเท่ากับ การกำหนด template เป็น listErrors('list')  
    showError() คำสั่งแสดงเป็นแต่ละรายการ จะกำหนด template ใน parameter ตัวที่ 2 โดยมีชื่อ 
template ค่าเริ่มต้นเป็น 'single' นั่นคือ สมมติฟิลด์ email ก็จะเป็น showError('email') เท่ากับ 
showError('email','single')
 
    นอกจากเราจะใช้รูปแบบการแสดงการแจ้งเตือนเป็น template แล้ว เรายังสามารถดึงเฉพาะข้อมูล errors 
แล้วจัดรูปแบบตามต้องการ โดยใช้คำสั่ง ดังนี้
 
    All Errors
 
getErrors() // คืนค่าเป็น array ของ errors ทั้งหมด

// Returns:
[
    'field1' => 'error message',
    'field2' => 'error message',
]
 
    Single Error
 
getError('email'); // คืนค่าเป็น string ข้อความ error ของฟิลด์ที่กำหนด

// The email field is required.
 
    จะเห็นว่าคำสั่งทั้งสองข้างต้น จะคืนค่าเป็นตัวแปรข้อมูล ที่เราสามารถนำไปจัดการหรือจัดรูปแบบการแสดง
กำหนดโครงสร้าง HTML แบบใดก็ได้ เหมาะสำหรับกรณีต้องการจัดการเฉพาะส่วนนั้นๆ ไม่ต้องใช้งาน template
    ตัวอย่างการใช้งาน
 
<?php
if(isset($validation)){
	$errors = $validation->getErrors();
	if($errors){
?>
<div class="alert alert-danger" role="alert">
    <ul>
    <?php foreach ($errors as $error) : ?>
        <li><?= esc($error) ?></li>
    <?php endforeach ?>
    </ul>
</div>
<?php
		}
}
?>
 
<div class="invalid-feedback">
<?= (isset($validation))?$validation->getError('email'):NULL ?>
</div>
 
    กรณีเราต้องการเช็คว่ามี error ฟิลด์ที่กำหนดหรือไม่ เพื่อใช้ในการกำหนดค่าเพิ่มเติมในส่วนที่ต้องการ เข่น
แทนที่จะใช้ข้อความจาก error โดยตรงก็อาจจะกำหนดเป็นข้อความอื่นๆ โดยใช้คำสั่ง hasError() ดังนี้
 
<?php
if (isset($validation) && $validation->hasError('email'))
{
//    echo $validation->getError('email');
	echo "กรุณากรอกอีเมล";
}
?>
 
    หรือจะใช้กำหนด css class สำหรับทำงานบางอย่างเช่น
 
<input type="email' name="email" 
 class="form-control <?=(isset($validation) && $validation->getError('email'))?"invalid":""?>" />
 
 
    การส่งค่า Validation instance เข้าไปใน  Views ก็จะมีประโยชน์ตรงที่เราสามารถเรียกใช้คำสั่งต่างๆ ได้
สะดวก ต่างจากรูปแบบตัวอย่างการใช้งาน model ที่เราจะส่งเฉพาะ array ของ errors ถ้ามี มาใช้งานแทน ซึ่ง
วิธีนั้นก็จะสะดวกกรณีที่เราไม่ต้องการกำหนด template ใดๆ ก็แค่ส่งค่า errors เข้ามา แล้วจัดการด้วยโค้ดตาม
ต้องการ  หรือกรณีที่ไม่มีการส่งค่า errors จากการ validated ใดๆ เข้ามาเลย เราก็สามารถเรียกใช้งาน Validation
ผ่าน validation class โดยตรงดังนี้ได้
 
    กรณีไม่ส่ง Validation instance หรือ errors ของการ validated ใดๆ เข้าไปใน views โดยใช้แค่คำสั่ง 
$this->validate() ตรวจสอบเท่านั้น
 
if(! $this->validate([
	'email' => 'required',
	'password' => 'required',
])){
	// $data['validation'] = $this->validator;
}					
echo view('pages/myform', $data);
 
    เราสามารถเรียกใช้งาน Validation class โดยตรงใน Views ได้ดังนี้
 
<?= \Config\Services::validation()->listErrors(); ?>
 
 
    กรณีเราต้องการส่งเฉพาะข้อมูล errors การ validated เหมือนกรณีใช้งาน model ก็สามารถกำหนดเป็นดังนี้ได้
 
$data = [
	'title' => 'test validated data'
];		
if(! $this->validate([
	'email' => 'required',
	'password' => 'required',
])){
	$data['errors'] = $this->validator->getErrors();
}
 
    โดยแทนที่จะส่งเป็น Validation instance เราก็ส่งเป็น array ของ Errors ถ้ามีเข้าไปใช้งานใน Views 
ส่วนในหน้า Views เราก็เรียกวนลูปแสดงข้อมูลปกติ
 
<div class="alert alert-danger" role="alert">
    <ul>
    <?php foreach ($errors as $error) : ?>
        <li><?= esc($error) ?></li>
    <?php endforeach ?>
    </ul>
</div>
 
    หรือต้องการเป็นบางรายการ ก็อ้างอิงผ่านตัวแปร $errors เช่น
 
<div class="invalid-feedback">
<?= esc($errors['email']) ?>
</div>
 
 

    การกำหนดเงื่อนไขการ Validated data

    เราสามารถกำหนดเงื่อนไขการเริ่ม validated ข้อมูลได้ทั้งแบบก่อนและหลังส่งข้อมูล หรือ
จะเป็นแบบหลังส่งข้อมูลอย่างเดียวก็ได้ เราจะลองใช้ฟอร์มสำหรับทดสอบเป็นดังนี้
 
    app/Views/pages/myform.php (บางส่วน)
 
<?= (isset($validation))?$validation->listErrors():NULL ?>

<!--     ส่วนของข้อมูลฟอร์ม ที่เราจะเพิ่ม-->
<?= form_open('helloworld') ?>
<input type="email" name="email" value="<?= set_value('email')?>">
<input type="password" name="password" value="<?= set_value('password')?>">
<button type="submit">Login</button>
<?= form_close() ?>
 
    เช็คทั้งก่อน และหลังส่งข้อมูลฟอร์ม
 
    app/Controllers/Helloworld.php (บางส่วน)
 
if ($this->validate([
	'email' => 'required',
	'password' => 'required',
]) && $this->request->getMethod() === 'post'){

}else{
	$data['validation'] = $this->validator;
}
 
    รูปแบบคำสั่งข้างต้น จะทำการเช็ค validated ก่อน โดยเช็คการส่งข้อมูลทีหลัง นั่นคือ ถ้าเรา
เข้ามาหน้าฟอร์ม ก็จะขึ้นรายการแจ้งว่าเราต้องกรอกอะไร ประมาณไหน ตามตัวอย่างผลลัพธ์ด้านล่าง
 
 

 
 
    และเมื่อเราลองกรอกข้อมูลเฉพาะส่วนของ email แล้วส่งข้อมูล การ validated ที่ทำงานก่อน 
ยังไม่ผ่าน และ ยังทำหน้าที่ตรวจสอบส่วนของ password และแสดงผลลัพธ์ ตามรูป
 
 

 
 
    และถ้าเรากรอกทั้ง email และ password แล้วส่งข้อมูล ก็ผ่านเงื่อนไขการ validated เราก็สามารถ
กำหนดการทำงานในขั้นตอนต่อไปใน เงื่อนไข if แรกได้เลย
 
 
    เช็คหลังส่งข้อมูลฟอร์ม
    กรณีนี้ จะไม่มีการขึ้นแจ้ง การ validated ใดๆ หากยังไม่กดส่งข้อมูล วิธีการใช้งานก็ง่ายๆ แค่สลับ
ตำแหน่งของการตรวจสอบการส่งข้อมูล ไว้ก่อนการเช็ค validated ดังนี้
 
    app/Controllers/Helloworld.php (บางส่วน)
 
if ($this->request->getMethod() === 'post' && $this->validate([
	'email' => 'required',
	'password' => 'required',
])){

}else{
	$data['validation'] = $this->validator;
}
 
    คำสั่งการตรวจสอบข้อมูลทำงานก่อน และเมื่อยังไม่ส่งข้อมูล ก็เป็น false โดยยังไม่ได้ทำการเช็คเงื่อนไขการ
validated ทำให้ไม่มีการส่ง Validation instance เข้าไปในฟอร์ม หรือก็คือคำสั่ง $this->validate() ยังไม่ทำงาน
ผลลัพธ์ที่ได้ก็จะเป็นดังนี้
 
 

 
 
    แต่ถ้าเราทำการกรอกข้อมูลเฉพาะ email แล้วกดส่ง คราวนี้คำสั่งเช็คการส่งข้อมูลเป็น true ก็คือมีการส่งข้อมูล
เมื่อเงื่อนไขแรกผ่าน ก็เช็คต่อที่เงื่อนไขที่สองคือการ validated ข้อมูล ทำให้คำสั่ง $this->validate() ถูกเรียก
ใช้งาน นั่นคือคำสั่งถูกเรียกใช้งานหลังส่งข้อมูลแล้ว และค่า Validation instance ก็ถูกส่งไปยังฟอรฺ์ม กรณีไม่ผ่าน
การ validated ข้อมูล ผลลัพธ์ เหมือนกับกรณีแรก ที่ส่งข้อมูล แล้วตรวจสอบไม่ผ่าน

 

 
 
    ดังนั้นเราสามารถเลือกใช้รูปแบบที่อยากได้ ตามต้องการ
 
 
 

การกำหนด Template การแจ้งเตือน

    อย่างที่ได้กล่าวไปแล้วข้างต้นว่า เมื่อเราใช้งานคำสั่ง $validation->listErrors() หรือ $validation->showError()
จะเป็นใช้งาน template ค่าเริ่มต้นของ CI เป็นโครงสร้าง HTML สำหรับแสดงการแจ้งเตือน  การใช้งาน template เหมาะ
สำหรับการจัดการ การแจ้งเตือนที่ต้องการรูปแบบที่แน่นอน แสดงเหมือนกันๆ ในหลายๆ ฟอร์ม และสามารถปรับแต่ง
ที่เดียว มีผลกับทุกส่วนที่ใช้งาน
     เราสามารถดู template และการกำหนดชื่อการใช้งาน เริ่มต้นได้ที่ไฟล์ app/Config/Validation.php ในส่วนของ
template ค่าเริ่มต้นก็จะประมาณนี้
 
    app/Config/Validation.php (บางส่วน)
 
/**
 * Specifies the views that are used to display the
 * errors.
 *
 * @var array
 */
public $templates = [
	'list'   => 'CodeIgniter\Validation\Views\list',
	'single' => 'CodeIgniter\Validation\Views\single',
];
 
    ไฟล์ list.php และ single.php ที่เป็นค่า default ของการแจ้งเตือน validation จะมีหน้าตาโครงสร้าง HTML ประมาณนี้
 
    CodeIgniter/Validation/Views/list.php
 
<?php if (! empty($errors)) : ?>
	<div class="errors" role="alert">
		<ul>
		<?php foreach ($errors as $error) : ?>
			<li><?= esc($error) ?></li>
		<?php endforeach ?>
		</ul>
	</div>
<?php endif ?>
 
    CodeIgniter/Validation/Views/single.php
 
<span class="help-block"><?= esc($error) ?></span>
 
    ตัวแปรที่จะถูกส่งไปใช้งานใน Views ทั้งสองคือ $errors และ $error ตามลำดับ
    ในการกำหนด template เอง เราสามารถใช้ชื่อ template เดิม ที่เป็นค่าหลักคือ list และ single โดยอาจ
จะเปลี่ยน path ของไฟล์ views ใหม่เป็นรูปแบบที่เราค้องการ ตัวอย่าง
 
public $templates = [
/*	'list'   => 'CodeIgniter\Validation\Views\list',
	'single' => 'CodeIgniter\Validation\Views\single',*/
	'list'   => 'validations/list',
	'single' => 'validations/single',	
	'my_list' => 'validations/my_error_list',	
];
 
    เราใช้ไฟล์ list.php ใน app/Views โดยสร้างไว้ในโฟลเดอร์ validations อึกที 
 
    app/Views/validations/list.php
 
<?php if (! empty($errors)) : ?>
<div class="alert alert-danger" role="alert">
    <ul>
    <?php foreach ($errors as $error) : ?>
        <li><?= esc($error) ?></li>
    <?php endforeach ?>
    </ul>
</div>
<?php endif ?>
 
    app/Views/validations/single.php
 
<div class="invalid-feedback">
<?= esc($error) ?>
</div>
 
    หรือกรณีเราต้องการเพิ่มชื่อใหม่เข้าไป อย่างตัวอย่างด้านบน เป็น my_list เราก็สามารถกำหนดรูปแบบโครงสร้าง
HTML ไว้ในไฟล์ app/Views/validations/my_error_list.php เป็นต้น 
 
 
 

รู้จักับ Rules แบบต่างๆ

    เราได้รู้จักวิธีกำหนดเงื่อนไขการตรวจสอบ การกำหนดรูปแบบการแสดงไปแล้ว สิ่งสำคัญลำดับต่อไปก็คือ 
มี rule อะไรบ้างให้เราเลือกใช้งาน 
    รายการต่อไปนี้เป็นหลักเกณฑ์ สำหรับการตรวจสอบข้อมูลของ CI ที่เราสามารถเรียกใช้งานได้
    แต่ก่อนที่จะไปแต่ละค่าของ rule ให้เราเข้าใจรูปแบบการกำหนดเบื้องต้นก่อน ดังนี้ rule ที่ไม่มี parameter เราสามารถ
กำหนดชื่อ rule นั้นๆ ได้เลย  ส่วน rule ที่มี parameter เราจะกำหนดค่า paramter ไว้ในเครื่องปีกกาสี่เหลี่ยนม [] เช่น
max_length[4]  บาง rule รองรับ paramter ทั้งแบบจำเป็นต้องมี และแบบ options มีหรือไม่ก็ได้ ในกรณีสามารถกำหนด
ได้มากกว่า 1 parameter จะแยกกันโดยคั่นด้วยเเครื่องหมาย (comma) , เช่น in_list[aaa,b,cc]
    ในการกำหนดค่า parameter ให้กับ rule จำไว้เสมอว่า จะต้องไม่มีช่องว่าง เช่น in_list[aaa, b,cc] แบบนี้ไม่ถูกต้อง
 
    alpha
    คำอธิบาย อักษรอังกฤษ a-zA-Z
    ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphabetical characters.
    ไม่มี parameter
 
    alpha_space
    คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ช่องว่าง space
    ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphabetical characters and spaces.
    ไม่มี parameter
 
    alpha_dash
    คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9 หรือ เครือ่งหมาย - หรือ _
    ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphanumeric, underscore, and dash characters.
    ไม่มี parameter
 
    alpha_numeric
    คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9
    ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphanumeric.
    ไม่มี parameter
 
    alpha_numeric_space
    คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9 หรือ ช่องว่าง space
    ข้อความแจ้ง The [ชื่อ Field'] field may only contain alphanumeric and space characters.
    ไม่มี parameter
 
    alpha_numeric_punct
    คำอธิบาย อักษรอังกฤษ a-zA-Z หรือ ตัวเลข 0-9 หรือ ช่องว่าง space หรือ เครื่องหมายเหล่านี้
    ~ (tilde), ! (exclamation), # (number), $ (dollar), % (percent),
    & (ampersand), * (asterisk), - (dash), _ (underscore), + (plus), = (equals),
    | (vertical bar), : (colon), . (period)
    ข้อความแจ้ง The [ชื่อ Field'] field may contain only alphanumeric characters, spaces, and ~ ! # $ % & 
    * - _ + = | : . characters.
    ไม่มี parameter
 
    decimal
    คำอธิบาย ตัวเลข 0-9 จำนวนเต็ม หรือเลขทศนิยม มีเครืองหมาย + หรือ - ด้านหน้าหรือไม่ก็ได้
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a decimal number.
    ไม่มี parameter
 
    differs
    คำอธิบาย ต้องต่างจากค่าของฟิลด์ที่กำหนด 
    ข้อความแจ้ง The [ชื่อ Field'] field must differ from the [ชื่อ Field 2'] field.
    มี parameter เช่น differs[date2]
 
    exact_length
    คำอธิบาย ต้องมีความยาวเท่ากับค่าที่กำหนด  หากกำหนดหลายค่า แยกโดยใช้ (,)
    ข้อความแจ้ง The [ชื่อ Field'] field must be exactly 3,5 characters in length.
    มี parameter เช่น exact_length[3,5]
 
    greater_than
    คำอธิบาย เทียบเป็นตัวเลข ต้องมากกว่าค่าที่กำหนด เทียบเท่าเครื่องหมาย ( > )
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a number greater than 6.
    มี parameter เช่น greater_than[6]
 
    greater_than_equal_to
    คำอธิบาย เทียบเป็นตัวเลข ต้องมากกว่าหรือเท่ากับค่าที่กำหนด เทียบเท่าเครื่องหมาย ( >= )
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a number greater than or equal to 6.
    มี parameter เช่น greater_than_equal_to[6]
 
    hex
    คำอธิบาย เป็นตัวอักขระในตัวเลขฐาน 16
    ข้อความแจ้ง The [ชื่อ Field'] field may only contain hexidecimal characters.
    ไม่มี parameter
 
    if_exist
    คำอธิบาย ใช้สำหรับให้ตรวจสอบ rule ต่อเมื่อมีการส่งฟิลด์นั้นๆ มาก่อนเท่านั้น มักใช้ร่วมกับ rule อืนๆ
    ไม่มี parameter
 
    in_list
    คำอธิบาย ต้องเท่ากับค่าใดค่าหนึ่ง ที่กำหนดในรายการเท่านั้น
    ข้อความแจ้ง The [ชื่อ Field'] field must be one of: aaa,b,cc.
    มี parameter เช่น in_list[aaa,บ้าน,ที่ทำงาน]
 
    integer
    คำอธิบาย ตัวเลขจำนวนเต็ม มีเครืองหมาย + หรือ - ด้านหน้าหรือไม่ก็ได้
    ข้อความแจ้ง The [ชื่อ Field'] field must contain an integer.
    ไม่มี parameter
 
    is_natural
    คำอธิบาย เฉพาะตัวเลขเท่านั้น ไม่มีเครื่องหมาย + หรือ - 
    ข้อความแจ้ง The [ชื่อ Field'] field must only contain digits.
    ไม่มี parameter
 
    is_natural_no_zero
    คำอธิบาย เฉพาะตัวเลขเท่านั้น ไม่มีเครื่องหมาย + หรือ - และมากกว่า 0
    ข้อความแจ้ง The [ชื่อ Field'] field must only contain digits and must be greater than zero.
    ไม่มี parameter
 
    is_not_unique
    คำอธิบาย เช็คค่าจาก database ถ้ามีค่านั้นๆ อยู่ ต้องเป็นค่าเดียวกัน มักใช้สำหรับการแก้ไขข้อมูลของฟิลด์เดิม
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a previously existing value in the database.
    มี parameter เช่น is_not_unique[table.field,where_field,where_value] 
        สามารถกำหนดเป็น is_not_unique[tbl_user.user_id,user_id,1]
 
    is_unique
    คำอธิบาย เช็คค่าจาก database ถ้ามีค่านั้นๆ อยู่ ต้องไม่ซ้ำกับค่าเดิม แต่สามารถกำหนดกรณียกเว้นเช่นการแก้ไขได้
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a unique value.
    มี parameter เช่น is_unique[table.field,ignore_field,ignore_value]
        สามารถกำหนดเป็น is_unique[tbl_user.email] // email ต้องไม่ซ้ำในฐานข้อมูล
        สามารถกำหนดเป็น is_unique[tbl_user.email,user_id,1] // email ต้องซ้ำได้ถ้าแก้ไขที่ user_id = 1
 
    less_than
    คำอธิบาย เทียบเป็นตัวเลข ต้องน้อยกว่าค่าที่กำหนด เทียบเท่าเครื่องหมาย ( < )
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a number less than 8.
    มี parameter เช่น less_than[8]
 
    less_than_equal_to
    คำอธิบาย เทียบเป็นตัวเลข ต้องน้อยกว่าหรือเท่ากับค่าที่กำหนด เทียบเท่าเครื่องหมาย ( <= )
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a number less than or equal to 13.
    มี parameter เช่น less_than_equal_to[13]
 
    matches
    คำอธิบาย ต้องมีค่าเท่ากับฟิลด์ที่กำหนด เช่น กรณีต้องการให้กรอกรหัสผ่านซ้ำ รหัสต้องเหมือนกัน
    ข้อความแจ้ง The [ชื่อ Field'] field does not match the [ชื่อ Field 2'] field.
    มี parameter เช่น matches[confirm_password]
 
    max_length
    คำอธิบาย ต้องมีความยาวไม่เกินค่าที่กำหนด
    ข้อความแจ้ง The [ชื่อ Field'] field cannot exceed 8 characters in length.
    มี parameter เช่น max_length[8]
 
    min_length
    คำอธิบาย ต้องมีความยาวไม่น้อยกว่าที่กำหนด
    ข้อความแจ้ง The [ชื่อ Field'] field must be at least 6 characters in length.
    มี parameter เช่น min_length[6]
 
    numeric
    คำอธิบาย ต้องเป็นต้วเลข หรือ เลขทศนิยม มีเครืองหมาย + หรือ - ด้านหน้าหรือไม่ก็ได้
    ข้อความแจ้ง The [ชื่อ Field'] field must contain only numbers.
    ไม่มี parameter
 
    regex_match
    คำอธิบาย ต้องเข้าเงื่อนไขรูปแบบของ regular expression ที่กำหนด
    ข้อความแจ้ง The [ชื่อ Field'] field is not in the correct format.
    มี parameter เช่น regex_match[/^[ก-๏\s]+$/u] ต้องเป็นภาษาไทย
 
    permit_empty
    คำอธิบาย มีการส่งค่านั้นหรือไม่ก็ได้ ไม่ใช้ร่วมกับ required หรือถ้ามีส่งค่า รองรับค่า 
    array ว่าง, string ว่าง, null หรือ false. ไม่มีแจ้งเตือน เหมาะกับใช้ปิดการแจ้งเตือน error
    ไม่มี parameter
 
    required
    คำอธิบาย ต้องไม่เป็นค่า array ว่าง, string ว่าง, null หรือ false
    ข้อความแจ้ง The [ชื่อ Field'] field is required.
    ไม่มี parameter
 
    required_with
    คำอธิบาย เมื่อมีการส่งค่า ฟิลด์จะต้องไม่ว่าง ถ้าฟิลด์ที่กำหนดมีการส่งค่ามาด้วย
    ข้อความแจ้ง The [ชื่อ Field'] field is required when [ชื่อ Field 2'] is present.
    มี parameter เช่น required_with[password]
 
    required_without
    คำอธิบาย ถ้ายังไม่ส่งข้อมูล ฟิลด์จะต้องไม่ว่าง ถ้าฟิลด์ที่กำหนดไม่มีการส่งค่ามา
    ข้อความแจ้ง The [ชื่อ Field'] field is required when [ชื่อ Field 2'] is not present.
    มี parameter เช่น required_without[zipcde]
 
    string
    คำอธิบาย ตัวอักษร ตัวอักขระ สัญลักษณ์ ตัวเลข ทุกตัวถูกมองเป็น string หมด แต่ต้องไม่เป็นค่าว่าง
    ข้อความแจ้ง The [ชื่อ Field'] field must be a valid string.
    ไม่มี parameter
 
    timezone
    คำอธิบาย ต้องเป็นรูปแบบ timezone ที่อยู่ใน timezone_identifiers_list เช่น Asia/Bangkok
    ข้อความแจ้ง The [ชื่อ Field'] field must be a valid timezone.
    ไม่มี parameter
 
    valid_base64
    คำอธิบาย ต้องมีรูปแบบข้อความเป็น base64
    ข้อความแจ้ง The [ชื่อ Field'] field must be a valid base64 string.
    ไม่มี parameter
 
    valid_json
    คำอธิบาย ต้องมีรูปแบบข้อความเป็น JSON
    ข้อความแจ้ง Validation.valid_json
    ไม่มี parameter
 
    valid_email
    คำอธิบาย ต้องอยู่ในรูปแบบ email ที่ถูกต้อง
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid email address.
    ไม่มี parameter
 
    valid_emails
    คำอธิบาย ต้องอยู่ในรูปแบบ email ที่ถูกต้องทุกรายการ email ที่คั่นด้วย (,)
    ข้อความแจ้ง The [ชื่อ Field'] field must contain all valid email addresses.
    ไม่มี parameter
 
    valid_ip
    คำอธิบาย ต้องอยู่ในรูปแบบ IP address ที่ถูกต้อง หากระบุว่าเป็น IP4 หรือ IP6 ได้
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid IP.
    ไม่มี parameter
 
    valid_url
    คำอธิบาย ต้องอยู่ในรูปแบบ URL ที่ถูกต้อง
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid URL.
    ไม่มี parameter
 
    valid_date
    คำอธิบาย ต้องอยู่ในรูปแบบวันที่ ที่ถูกต้อง สามารถระบุรูปแบบได้ 
    ข้อความแจ้ง The [ชื่อ Field'] field must contain a valid date.
    ไม่มี parameter
 
    valid_cc_number
    คำอธิบาย ต้องอยู่ในรูปแบบ  เลขบัตรเครดิต ที่ถูกต้อง โดยสามารถระบุตามผู้ออกบัตรได้ 
    ข้อความแจ้ง Validation.valid_cc_number
    มี parameter เช่น valid_cc_number[mastercard,visa,amex,jcb]
        ค่าที่กำหนดได้ ใช้ค่าในวงเล็บ
        American Express (amex), China Unionpay (unionpay),
        Diners Club CarteBlance (carteblanche), Diners Club (dinersclub), 
        Discover Card (discover),Interpayment (interpayment), JCB (jcb), 
        Maestro (maestro), Dankort (dankort), NSPK MIR (mir),
        Troy (troy), MasterCard (mastercard), Visa (visa), UATP (uatp), Verve (verve),
        CIBC Convenience Card (cibc), Royal Bank of Canada Client Card (rbc),
        TD Canada Trust Access Card (tdtrust), Scotiabank Scotia Card (scotia), 
        BMO ABM Card (bmoabm),HSBC Canada Card (hsbc)
 
 

    Rule สำหรับการอัพโหลด

    สำหรับการอัพโหลดไฟล์ เราก็มีรายการ rule ให้ใช้งาน ทำให้สะดวกในการนำไปใช้  สมมติว่าฟิลล์ข้อมูลฟอร์ม
เราแสดงประมาณนี้
 
<input type="file" name="avatar">
 
    ตัวอย่างการกำหนด rule ใน Controller
 
$this->validate([
    'avatar' => 'uploaded[avatar]|max_size[avatar,1024]'
]);
 
    มาดูแต่ละค่า พร้อมคำอธิบายและตัวอย่าง ดังนี้
 
    uploaded
    คำอธิบาย ต้องอัพโหลด ข้อมูลใน ฟิลด์ที่กำหนด
    ข้อความแจ้ง avatar is not a valid uploaded file.
    มี parameter เช่น uploaded[field_name] ตัวอย่าง uploaded[avatar]
 
    max_size
    คำอธิบาย ต้องมีขนาดของไฟล์ไม่เกินค่าที่กำหนด
    ข้อความแจ้ง avatar is too large of a file.
    มี parameter เช่น max_size[field_name,2048]
 
    max_dims
    คำอธิบาย ต้องเป็นรูปภาพ และขนาดความกว้างกับความสูง ต้องไม่เกินที่กำหนด
    ข้อความแจ้ง avatar is either not an image, or it is too wide or tall.
    มี parameter เช่น max_dims[field_name,300,150]
 
    mime_in
    คำอธิบาย ต้องเป็นไฟล์ที่มีค่า MIME type เป็นตามรายการค่าที่กำหนด
    ข้อความแจ้ง avatar does not have a valid mime type.
    มี parameter เช่น mime_in[field_name,image/png,image/jpg]
 
    ext_in
    คำอธิบาย ต้องมีนามสกุลไฟล์ตามรายการที่กำหนด
    ข้อความแจ้ง avatar does not have a valid file extension.
    มี parameter เช่น ext_in[field_name,png,jpg,gif]
 
    is_image
    คำอธิบาย อัพโหลดได้เฉพาะไฟล์รูปเท่านั้น เช็คจากค่า MIME type
    ข้อความแจ้ง avatar is not a valid, uploaded image file.
    มี parameter เช่น is_image[field_name] ตัวอย่าง is_image[avatar]
 
 
 

การกำหนด Validation Rule

    รูปแบบ Array ของ Validation Rule

    โดยทั่วไปแล้ว การกำหนด validation rule จะใช้เป็น array ข้อมูล โดยมี key เป็นชื่อฟิลด์ที่ตรงกับ name
ของ ฟิลด์ในฟอร์ม และ value เป็น รูปแบบ rule ที่ใช้งาน โดยคั่นแยกแต่ละ rule ด้วย | (pipe) อย่างเช่น rule
ในตัวอย่างเริ่มต้นเราก็จะเป็นประมาณนี้ สมมติเรากำหนดในตัวแปร $rules 
 
$rules = [
	'email' => 'required',
	'password' => 'required',
];
if(! $this->validate($rules)){
	$data['validation'] = $this->validator;
}
 
    จะเห็นว่า แทนที่เราจะกำหนด array ของ rule ไว้ในคำสั่ง validate() โดยตรง เราก็ส่งเป็นตัวแปรเข้าไปแทน
    โครงสร้าง array ของ rule ยังสามารถกำหนดแบบนี้ได้
 
$rules = [
    'email' => [
			'label' => 'Email', 
			'rules' => 'required',
	],
    'password' => [
		'label' => 'Password',
		'rules' => 'required',
	]
];
 
    กรณีข้างบนนี้ ไว้ถ้าเราต้องการเปลี่บนชื่อที่แสดงตอนแจ้งเตือน ซึ่งปกติจะใช้ชื่อฟิลด์นั้นๆ แต่ถ้าเราต้องการเปลี่ยน
เป็นชื่อใหม่ ที่อาจจะดูเข้าใจกว่า ก็สามารถกำหนด label เพื่อเป็นค่าแสดงแทนได้
    ในข้อความแจ้งเตือน error ที่ไม่ผ่านการตรวจสอบ ค่าเริ่มต้น จะเป็นภาษาอังกฤษ รูปแบบข้อความก็ตามที่อธิบายไป
ในแต่ละ rule ด้านบน แต่ถ้าเราอยากกำหนดรูปแบบข้อความเอง หรืออาจจะอยากใช้เป็นภาษาไทย ก็สามารถกำหนดเพิ่ม
ในส่วนของ errors ดังนี้ได้
 
$rules = [
    'email' => [
			'rules' => 'required|valid_email',
			'errors' => [
                'required' => 'กรุณากรอกอีเมล',
				'valid_email' => 'รูปแบบอีเมลไม่ถูกต้อง',
            ]			
	],
    'password' => [
		'rules' => 'required',
		'errors' => [
			'required' => 'กรุณากรอกรหัสผ่าน',
		]					
	]
];
 
 

    การกำหนดชื่อฟิลด์ กรณี key เป็น array

    ปกติชื่อฟิลด์ข้อมูลที่ใช้เปฺ็น key ของ validation rule จะเป็นชื่อของฟิลด์ข้อมูลฟอร์ม เราสามารถเรียกใช้งาน
ได้เลย เว้นแต่ถ้าเป็นกรณีชื่อฟิลด์นั้นกำหนดมาในรูปแบบ array เช่น
 
<input type="text" name="hobby[]" value="" />
<input type="text" name="hobby[]" value="" />
 
    เวลาเราอ้างอิงชื่อฟิลด์ เราจะใช้ hobby.0 กับ hobby.1 ถ้าต้องการระบุชัดๆ ว่าใช้เป็นตัวไหน
 
$rules = [
	'hobby.0' => 'required',
	'hobby.1' => 'required',
];
 
    เราสามารถกำหนดแยกกันชัดเจน ตามรูปแบบด้านบน หรือถ้าเราต้องการกำหนดแบบรวมกัน นั่นคือ โดยไม่แยกแต่
ละรูปแบบ ก็จะเครื่องหมาย * แทน key ใดๆ ก็ได้ ก็สามารถกำหนดเหลือเป็น
 
$rules = [
	'hobby.*' => 'required',
];
 
    นอกจาก key ที่เป็นแบบ base zero key แล้ว name key ก็สามารถใช้ได้เหมือนกัน 
 
<input type="text" name="address[home]" value="" />
<input type="text" name="address[work]" value="" />
 
    ตัวอย่างการกำหนดก็จะประมาณนี้
 
$rules = [
	'address.home' => 'required',
	'address.work' => 'required',
];
// หรือ 
$rules = [
	'address.*' => 'required',
];
 
 

     การกำหนด Group Set ของ Rule ไว้ใช้งาน

     เราสามารถกำหนดรูปแบบของ rule ไว้ในไฟล์ app/Config/Validation.php โดยกำหนดชื่อ set ของ rule
เป็น public property หนึ่งของ validation class สมมติเราเพิ่มตัวอย่าง แบบง่ายนี้เข้าไป
 
    app/Config/Validation.php (บางส่วน)
 
//--------------------------------------------------------------------
// Rules
//--------------------------------------------------------------------
public $login = [
	'email' => 'required',
	'password' => 'required',	
];
 
    โดยแทนที่เราจะกำหนดไว้ในหน้าใดๆ หน้าหนึ่ง กรณีรูปแบบการตรวจสอบนั้นๆ อาจจะต้องใช้งานส่วนอื่นๆ หรือใช้งาน
หน้าอื่นด้วย เราก็มากำหนดไว้ในที่ๆ เดียว เวลาเรียกใช้งาน เราก็ใช้ชื่อ Group set กำหนดแทน array ของ Rule ตัวอย่าง
เช่น สามารถกำหนดเรียกใช้งานได้ดังนี้
 
if(! $this->validate('login')){ // กำหนดเป็น string ชื่อ group set ที่ต้องการใช้งาน
	$data['validation'] = $this->validator;
}
 
    เราสามารถเพิ่ม Group set ได้ตามต้องการในไฟล์ Validation.php
 
 

    การกำหนด และใช้งาน Rule ผ่าน Validation instance

    เราได้รู้แล้วว่า ใน Controller เราสามารถกำหนดและใช้งาน Validation ผ่านคำสั่ง $this->validate()  และสามารถใช้งาน
Validation instance ของ Controller ผ่านคำสั่ง  $this->validator
     นอกจากวิธีที่ได้ไปทั้งหมดข้างต้นแล้ว ยังมีอีกวิธี ที่เราสามารถกำหนดและเรียกใช้งาน Validation Data ผ่าน Controller
หรือแม้แต่ class อื่นๆ นอกจาก Controller ได้  โดยใช้งานผ่าน Validation instance โดยตรง ดังนี้
 
    app/Controllers/Helloworld.php
 
<?php namespace App\Controllers; 
use CodeIgniter\Controller; // เรียกใช้งาน Controller class
class Helloworld extends Controller 
{
    public function index() 
    {  
        helper('form'); // ใช้งาน form helper ฟังก์ชั่น
		$data = [
			'title' => 'test validated data'
		];				
		$validation = service('validation'); // Validation instance
		$validation->setRules([
			'email' => 'required',
			'password' => 'required'
		]);		
		if ($validation->withRequest($this->request)->run()){

		}else{
			$data['validation'] = $validation;
		}
		echo view('pages/myform', $data);
    }
}
 
    วิธีข้างต้น เราใช้งานผ่าน Validation instance ทั้งการกำหนด rule ผ่านคำสั่ง setRules()  และตรวจสอบเมื่อมี
การส่งข้อมูลด้วยคำสั่ง $validation->withRequest($this->request)->run()  และถ้าไม่ผ่านการตรวจสอบ เราก็
ส่ง Validation instance เข้าไปในฟอร์ม วิธีนี้ให้ผลลัพธ์เหมือนกันกับ แต่เราสามารถกำหนดหรือใช้งานที่อื่น นอก
Controller ได้
 
    คำสั่ง setRules() มีรูปแบบการกำหนด array เหมือนกันทุกอย่าง แต่ถ้าต้องการกำหนด ทีละฟิลด์ข้อมูล
สามารถใช้คำสั่ง setRule() แทน 
 
$validation->setRule('email','Email','required');	
$validation->setRule('password','Password','required');	
 
    ถ้าต้องการเช็คค่าบางค่า ที่ไม่ได้ส่งจากฟอร์ม สามารถใช้คำสั่ง check() ดังนี้ได้
 
$validation->check($value, 'required');	
 
    ค่าของตัวแปร $value จะถูกรวมเข้าไปในเงื่อนไขการตรวจสอบด้วย
 
    เราสามารถดึงชื่อของ Rule Group set มาใช้งานด้วยคำสั่ง seRuleGroup()
 
$validation->setRuleGroup('login');
if ($validation->withRequest($this->request)->run()){

}else{
	$data['validation'] = $validation;
}
 
    หรือจะใช้คำสั่ง getRuleGroup() ดึงข้อมูล Group set มาไว้ในตัวแปร แล้วเรียกใช้งานทีหลังก็ได้ ดังนี้
 
$rules = $validation->getRuleGroup('login');
$validation->setRules($rules);
if ($validation->withRequest($this->request)->run()){

}else{
	$data['validation'] = $validation;
}
 
    ข้อดีอย่างหนึ่งของการใช้งานผ่าน Validation instance คือเราสามารถเลือกข้อมูลใดๆ มาทำการตรวจสอบก็ได้
ไม่จำเป็นต้องเป็นข้อมูลที่ส่งฟอร์ม อย่างวิธีการข้างต้น ใช้การตรวจสอบข้อมูลที่มีการส่งเข้ามา ด้วยคำสั่ง 
withRequest($this->request) แต่ถ้าเราต้องการตรวจสอบข้อมูลตัวแปรใดๆ ก็ใช้เพียงคำสั่ง $validation->run() 
ดูตัวอย่าง กรณีใช้งานการตรวจสอบข้อมูลๆ หลายๆ ค่า เช่น ตรวจสอบรูปแบบอีเมล
 
$email_list = [
	[ 'email'=>'aaa.com'],
	[ 'email'=>'aaa@aaa.com'],
	[ 'email'=>'aaa-com'],
];
foreach($email_list as $email){
	$validation->reset();
	$validation->setRules([
		'email'=>'valid_email'
	]);
	if (!$validation->run($email)) {
		echo "Invalid<br>";
	}else{
		echo 'Valid<br>';
	}		
}
 
 

    การแทนค่าข้อมูลใน Rule

    ในการใช้งานบาง rule เราอาจจะต้องส่งค่าข้อมูลไปใช้ในการตรวจสอบ เราเรียกตำแหน่ง ที่จะถูกแทนที่ด้วยข้อมล
ว่า Placeholder เหมือนเป็นตัวกันพื้นที่สำหรับใช้ข้อมูลที่ถูกส่งเข้ามาแทน ตัวอย่าง rule ที่อาจจะต้องมีการส่งข้อมูล
เช่น is_unique สมมติว่าข้อมูลตราง users มีฟิลด์ email ที่เราไม่ต้องการให้ซ้ำกัน ถ้าเป็นการเพิ่มข้อมูลใหม่ ดังนั้น
รูปแบบ rule ที่เราจะใช้ก็เป็น is_unique[users.email]
 
$validation->setRules([
    'email' => 'required|valid_email|is_unique[users.email]'
]);
 
    ดังนั้นก่อนเพิ่มข้อมูล ก็จะมีการไปเช็คตาราง users ฟิลด์ email ว่าค่าอีเมล ที่ส่งไปนี้มีอยู่แล้วหรือใหม่ ถ้าไม่มีก็ทำ
สั่งอื่นๆ เช่นบันทึกลงไป  
    แต่กรณีปัญหาที่อาจจะเกิดก็คือ เมื่อเป็นการแก้ไขข้อมูล เวลาแก้ไขข้อมูล สมมติเราไม่แก้ไข email เวลาส่งเข้าไป
ตรวจสอบด้วย rule ข้างต้น ก็จะไม่ผ่าน เพราะว่ามี email นี้อยูแล้ว ดังนั้น เราจะต้องกำหนด option เพิ่มเติม คือ ถ้า
ฟิดล์ที่ระบุต่อไปนี้ มีค่าเท่ากับค่าที่กำหนด ให้สามารถ ละหรือข้ามเงื่อนไขไปได้ ก็จะเป็น
 
$validation->setRules([
    'email' => 'required|valid_email|is_unique[users.email,id,{id}]'
]);
 
    จะเห็นว่า เราเปลี่ยนรูปแบบใหม่ is_unique[users.email,id,{id}] ให้รองรับการยกเว้นการตรวจสอบ กรณี id มีค่า
เท่ากับ {id} ส่วนนี้เรียกว่า placeholder ที่จะถูกแทนที่ด้วยข้อมูลที่ส่งมา เช่น ถ้าคนนั้นแก้ไขข้อมูล เขาก็จะมี id ถ้าเป็น
การแก้ไขข้อมูลที่ id ตรงกัน นั้นคือ เป็นการแก้ไขข้อมูลของคนๆ นั้น อีเมลซ้ำกันได้นั่นเอง
    ถ้าสมมติว่าเราส่งค่า id เป็น 4 เข้าไป รูปแบบของ rule ก็จะเปลี่ยนอัตโนมัติตามค่าที่ส่งเข้าไปแทนที่ ก็จะเป็น
 
$validation->setRules([
    'email' => 'required|valid_email|is_unique[users.email,id,4]'
]);
 
    วิธีนี้จึงมีประโยชน์สำหรับการแก้ไข ข้อมูลกรณีมีการตรวจสอบค่าใดๆ ว่าซ้ำหรือไม่
 
 
    เนื้อหาเกี่ยวกับ การตรวจสอบความถูกต้องของข้อมูล เมื่อมีการส่งค่าจากฟอร์ม ก็มีรายละเอียดประมาณนี้ พยายาม
ให้ครอบคลุมการใช้งานต่างๆ และให้เข้าใจการนำไปใช้งาน ตามเหมาะสม หวังว่าจะเป็นประโยชน์ในการปรับใช้งานต่อไป


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



( หรือ เข้าใช้งานผ่าน Social Login )




URL สำหรับอ้างอิง











เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ