codeigniter hooks ทำความเข้าใจและใช้งาน hooks point

php-codeigniter-framework
php-codeigniter-framework

codeigniter hooks ทำความเข้าใจและใช้งาน hooks point



สำหรับ hooks ใน codeigniter เป็นฟีเจอร์ที่มีไว้สำหรับปรับเปลี่ยนลำดับขั้นตอนการทำงานหรือแทรกความสามารถ
บางอย่างเข้าไปแบบมีลำดับขั้นตอน โดยที่ไม่ต้องเข้าไปยุ่งเกี่ยวกับไฟล์หลัก ตัวอย่างเช่น อาจมีบางกรณีที่เราต้องการ
เพิ่มข้อมูลเข้าไปในส่วนของ controller ใด ๆ ก่อนที่จะเข้าสู่การทำงานของ constructure ฟังก์ชั่น

ของ controller นั้น ๆ หรืออาจจะต้องการเพิ่มการทำงานบางอย่างเข้าไปหลังจากที่ constructure ทำงานเสร็จแล้ว
หรือแม้กระทั้ง controller นั้น ๆ ได้ทำงานเสร็จแล้วค่อยเรียกการทำงานบางอย่างเข้าไป ก็สามารถทำได้ด้วย
Hooks class เช่นเดียวกัน

เปิดใช้งาน hooks

สำหรับการเปิดใช้งาน hooks ให้เปิดไฟล์ application/config/config.php และเปลี่ยนตัวแปร enable_hooks
จากค่าปกติที่เป็น FALSE ให้เป็น TRUE

$config['enable_hooks'] = TRUE;


สร้างไฟล์ hooks class

การสร้าง hooks คลาสนั้น ให้เราสร้างไว้ในโฟลเด้อ application/hooks/ ในที่นี้ให้เราทดลองสร้างไฟล์ WebHook.php
โดยที่ภายในคลาสนี้เราจะต้องสร้าง method มาเพื่อระบุการทำงานใน hooks แต่ละขั้นตอนด้วย จะได้โค๊ดประมาณนี้

application/hooks/WebHook.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
 
class WebHook {
 
	public function __construct(){
	 
	}
	public function pre_system(){
	 	echo "pre_system.<br>";
	}
}
?>


เรียกใช้งานแบบเป็นลำดับขั้นตอนของ hooks class

หลังจากได้คลาสและฟังก์ชั่นที่จะเรียกใช้งานแล้ว ให้เราไปกำหนดลำดับการทำงานที่ไฟล์
สำหรับการสั่งให้คลาส WebHook ทำงานแต่ละเมธอดแบบเป็นลำดับขั้นนั้นเราจะเขียนคำสั่งใน hooks.php ได้ดังนี้

application/config/hooks.php

 'WebHook', // ชื่อคลาส
        'function' => 'pre_system', // ชื่อฟังก์ชั่นที่เรียกใช้งานหรือเมธอด
        'filename' => 'WebHook.php', // ชื่อไฟล์
        'filepath' => 'hooks', // โฟลเด้อหรือตำแหน่งของไฟล์
        'params'   => '' // สำหรับส่งตัวแปรพารามิเตอร์ไปแบบอาเรย์
);


Hook Points

ในการเรียกใช้งาน hook class นั้น จะต้องมีตัวแปรสำหรับเป็นตัวกำหนดลำดับขั้นตอนการทำงาน
เราเรียกสิ่งนั้นว่า Hook Points ใน codeigniter framework มี Hook Points ให้เราเลือกใช้งานอยู่หลัก ๆ ดังนี้

  • pre_system ถูกเรียกตั้งแต่แรกเริ่มของการทำงานระบบ
  • pre_controller ถูกเรียกทันทีก่อนที่ตัวควบคุม (controller) ใดๆจะถูกเรียก
  • post_controller_constructor ถูกเรียกทันทีเมื่อ constructructor ทำงาน
  • post_controller ถูกเรียกทันทีเมื่อ controller ทำงานเสร็จสมบรูณ์
  • post_system ถูกเรียกหลังสิ้นสุดการทำงานของระบบหลักทั้งหมด

hook points อื่น ๆ ท่านสามารถอ่านรายละเอียดเพิ่มเติมได้ที่ https://www.codeigniter.com/user_guide/general/hooks.html

สร้าง Controller มาทดสอบการทำงาน

หลังจากที่เราได้ตั้งค่าเปิดใช้งาน สร้าง hook class และเรียกใช้งานฟังก์ชั่นของ hook class แล้ว
ขั้นตอนต่อไปให้ลองสร้าง controller มาทดสอบการทำงานดูว่าผลลัพธ์จะเป็นอย่างไร

application/controllers/Home.php


ผลลัพธ์

pre_system


ทดสอบลำดับขั้นตอนการทำงานของ Hook Points

เขียนฟังก์ชั่นเพิ่มเติมสำหรับเรียกใช้งานแต่ละ point ใน application/hooks/WebHook.php ดังนี้
application/hooks/WebHook.php

";
	}	
	public function pre_controller(){
	 	echo "pre_controller.
"; } public function post_controller_constructor(){ echo "post_controller_constructor.
"; } public function post_controller(){ echo "post_controller.
"; } public function post_system(){ echo "post_system.
"; } } ?>

เรียกใช้งานฟังก์ชั่นแบบลำดับขั้นตอนโดยกำหนด hook points ที่ไฟล์ application/config/hooks.php ดังนี้
application/config/hooks.php

 'WebHook',
        'function' => 'pre_system',
        'filename' => 'WebHook.php',
        'filepath' => 'hooks',
        'params'   => ''
);
$hook['pre_controller'] = array(
        'class'    => 'WebHook',
        'function' => 'pre_controller',
        'filename' => 'WebHook.php',
        'filepath' => 'hooks',
        'params'   => ''
);
$hook['post_controller_constructor'] = array(
        'class'    => 'WebHook',
        'function' => 'post_controller_constructor',
        'filename' => 'WebHook.php',
        'filepath' => 'hooks',
        'params'   => ''
);
$hook['post_controller'] = array(
        'class'    => 'WebHook',
        'function' => 'post_controller',
        'filename' => 'WebHook.php',
        'filepath' => 'hooks',
        'params'   => ''
);
$hook['post_system'] = array(
        'class'    => 'WebHook',
        'function' => 'post_system',
        'filename' => 'WebHook.php',
        'filepath' => 'hooks',
        'params'   => ''
);

ผลลัพธ์

pre_system.
pre_controller.
post_controller_constructor.
post_controller.
post_system.

วิธีใช้งาน-hooks-ใน-codeigniter
หลังจากที่เราทดสอบการทำงานแบบนี้แล้ว จะทำให้เราทราบว่า hook point ไหน ทำงานก่อน - หลัง และทำงานตอนไหน
เมื่อทราบอย่างนี้แล้วก็จะสามารถทำความสามารถของ hooks ใน codeigniter framework ไปประยุกต์ใช้ในการทำงาน
พัฒนาเว็บไซต์ในรูปแบบต่าง ๆ ได้ดียิ่งขึ้น และยังเป็นการใช้ความสามารถของ codeigniter ได้อย่างเต็มที่อีกด้วย