Controllers (ตัวควบคุม)
Controllers (ตัวควบคุม) เป็นหัวใจของแอพพลิเคชันของคุณเลยทีเดียว, เนื่องจากมันเป็นตัวกำหนดว่าการร้องขอ HTTP ใดควรจะถูกกระทำ(ตอบสนอง)อย่างไร
- อะไรคือ Controller (ตัวควบคุม)?
- Hello World
- ฟังก์ชันต่างๆ
- การส่งค่าแบบเป็นส่วนๆของ URI ผ่านฟังก์ชันของคุณเอง
- กำหนด Controller (ตัวควบคุม) แบบปริยาย
- การเรียกใช้ฟังก์ชันกำหนดเส้นทาง
- การควบคุมข้อมูลแสดงออก
- ฟังก์ชันปกปิด
- จัดระบบ Contoller (ตัวควบคุม) ต่างๆแบบโฟลเดอร์ย่อย
- Class Constructors (คลาสตัวสร้าง)
- ฟังก์ชันสงวน
อะไรคือ Controller (ตัวควบคุม)?
Controller (ตัวควบคุม) เป็นไฟล์คลาสแบบง่ายๆ ที่ถูกตั้งชื่อในลักษณะที่สามารถจับคู่กับ URI นึงๆได้
ลองพิจารณา URI นี้:
example.com/index.php/blog/
ในตัวอย่างข้างต้น CodeIgniter จะพยายามหา controller (ตัวควบคุม)ที่ชื่อว่า blog.php และโหลดไฟล์นี้
เมื่อชื่อของ Controller (ตัวควบคุม) ตรงกับส่วนแรกของ URI controller (ตัวควบคุม) นั้นจะถูกโหลด
ลองกันเลย: Hello World!
เรามาลองสร้าง controller (ตัวควบคุม)แบบง่ายๆ เพื่อที่คุณจะเห็นการทำงานของมัน โดยใช้เท็กซ์เอดิเตอร์ของคุณเอง สร้างไฟล์ blog.php และนำโค้ดด้านล่างนี้ไปวาง
แล้วบันทึกไว้ไฟล์ไว้ที่โฟลเดอร์ application/controllers/
ลองเปิดหน้านี้ด้วย URL แบบนี้:example.com/index.php/blog/
ถ้าไม่มีอะไรผิดพลาด คุณจะเห็นประโยค Hello World!
หมายเหตุ: ชื่อของคลาสควรขึ้นต้นด้วยตัวอักษรตัวใหญ่, แบบนี้ถูกต้อง:
<?php
class Blog extends Controller {
}
?>
แบบนี้ไม่ถูกต้อง:
<?php
class blog extends Controller {
}
?>
เช่นเดียวกัน ให้แน่ใจว่า controller (ตัวควบคุม)ของคุณได้ขยายมาจากคลาส controller เพราะมันจะมีฟังก์ชันสืบทอดมาให้ได้ใช้งานทั้งหมด
ฟังก์ชันต่างๆ
ในตัวอย่างข้างบน ฟังก์ชันที่ชื่อว่า index() ฟังก์ชัน "index" จะถูกโหลดเสมอโดยปริยายถ้าไม่การระบุส่วนไปใน URI อีกวิธีที่จะแสดงข้อความ "Hello World!" ก็คือ:example.com/index.php/blog/index/
ส่วนที่สองของ URI บอกว่าฟังก์ชันไหนใน controller (ตัวควบคุม) จะถูกเรียก
ลองเพิ่มฟังก์ชันใหม่นี้ใน controller (ตัวควบคุม) ของคุณ:
แล้วเรียกตาม URL ข้างล่างนี้ เพื่อดูผลของฟังก์ชัน comment:example.com/index.php/blog/comments/
คุณควรจะเห็นเป็นข้อความใหม่:
ส่งค่าแบบเป็นส่วนๆของ URI ผ่านฟังก์ชันของคุณเอง
ถ้า URI ของคุณมีส่วนมากกว่าสองส่วนมันจะถูกส่งไปให้ฟังก์ชัน เหมือนเป็นพารามิเตอร์
ตัวอย่าง, สมมติว่า URI ของคุณเป็นแบบนี้:example.com/index.php/products/shoes/sandals/123
ฟังก์ชันของคุณจะได้รับค่าจาก URI ส่วนที่ 3 และ 4 ("sandals" และ "123"): <?php
class Products extends Controller {
function shoes($sandals, $id)
{
echo $sandals;
echo $id;
}
}
?>
สำคัญ: ถ้าคุณใช้ URI Routing, ส่วนที่ถูกส่งไปให้กับฟังก์ชันคุณจะถูกกำหนดเส้นทางใหม่
กำหนด Controller (ตัวควบคุม) แบบปริยาย
CodeIgniter สามารถบอกให้โหลด controller (ตัวควบคุม) โดยปริยายเมื่อ URI ไม่ได้บ่งบอกว่าเป็นตัวไหน เหตุการณ์นี้จะเิกิดขึ้นเฉพาะ URL รากของคุณถูกเรียก การกำหนด controller (ตัวควบคุม) โดยปริยาย ใหคุณเปิดไฟล์ application/config/routes.php หาและตั้งค่าตัวแปรนี้:$route['default_controller'] = 'Blog';
Blog เป็นชื่อของคลาส controller (ตัวควบคุม) ที่คุณต้องการเรียกใช้ ถ้าคุณเรียก index.php โดยไม่ระบุ ส่วนของ URI เลย คุณจะเห็นข้อความ Hello World โดยอัตโันมัติิ
การเรียกใช้ฟังก์ชันกำหนดเส้นทาง
ตามหมายเหตุด้านบน ส่วนที่สองของ URI จะเป็นการกำหนดว่าฟังก์ชันไหนของ controler (ตัวควบคุม) จะถูกเรียก CodeIgniter อนุญาตให้คุณกำหนดเองได้โดยการใช้ฟังก์ชัน _remap():function _remap()
{
// Some code here...
}
สำคัญ: ถ้า controller (ตัวควบคุม) ของคุณมีฟังก์ชันที่ชื่อว่า _remap() ส่วนของ URI ก็จะไม่มีผล ตัว _remap()จะทับส่วนของ URI ในการทำงานทั่วๆไป ซึ่ง URI กำหนดว่าฟังก์ชันไหนจะถูกเรียกใช้ เป็นการอนุญาตให้คุณกำหนดกฏการเลือกเส้นทางในฟังก์ชันของคุณขึ้นมาเอง
ฟังก์ชันที่เขียนทับ (ปกติจะเป็นส่วนที่สองของ URI) จะถูกส่งค่าให้เป็นพารามิเตอร์ให้แก่ฟังก็ชัน _remap():function _remap($method)
{
if ($method == 'some_method')
{
$this->$method();
}
else
{
$this->default_method();
}
}
กระบวนการแสดงผลัพธ์
CodeIgniter มีคลาสที่เอาไว้ใช้ทำหน้าที่ส่งข้อมูลที่ผ่านการประมวลผลแล้ว แล้วส่งไปให้กับเว็บ บราวเซอร์ (web browser) โดยอัติโนมัติ สามารถดูข้อมูลเพิ่มเติมได้จาก Views และ Output class ในบางกรณี ไม่ว่าอะไรก็ตาม คุณอาจจะต้องการจัดการข้อมูลก่อนที่จะเป็นข้อมูลที่ประมวลผลเสร็จด้วยวิธีการบางอย่าง และส่งข้อมูลไปให้กับบราวเซอร์ (browser) ด้วยตัวคุณเอง CodeIgniter อนุญาตให้คุณสามารถเพิ่มฟังก์ชัน _output()เข้าไปใน controller (ตัวควบคุม)ของคุณ ซึ่งมันเป็นฟังก์ชันที่จะรับข้อมูลสุดท้ายที่จะแสดงออกต่อไป
สำคัญ: ถ้า controller (ตัวควบคุม)ของคุณมีฟังก์ชันที่ชื่อว่า _output(), ฟังก์ชันนี้จะถูกเรียกใช้ก่อน แทนที่จะแสดงออกข้อมูลโดยตรงเลย พารามิเตอร์ตัวแรกจะเป็นจะเป็นข้อมูลผลลัพธ์สุดท้าย
ดังตัวอย่าง:
function _output($output)
{
echo $output;
}
โปรดจำไว้ว่า ฟังก์ชัน _output() ของคุณ จะรับข้อมูลในสถานะที่ได้ประมวลเสร็จแล้ว การเปรียบเทียบวัดและการใช้หน่วยความจำจะถูกประมวลผล ไฟล์เก็บค่าชั่วคราว (cache) จะถูกเขียนข้อมูลลงไป (ถ้าระบบการจำค่าชั่วคราว(caching) ของคุณเปิดใช้งาน), และข้อมูลส่วนหัวจะถูกส่ง(ถ้าคุณใชคุณสมบัติที่กล่าวไปนั้น feature)ก่อนที่มันจะถูกส่งไปให้ฟังก์ชัน _output ถ้าคุณกำลังใช้คุณสมบัตินี้ตับจับเวลาการประมวลผลหน้าและสถานะการใช้หน่วยความมันอาจจะไม่ถูกต้องสมบูรณ์เนื่องจากข้อมูลเหล่านั้นจะไม่ถูกนำเข้าไม่ว่ากระบวนการใดๆที่คุณทำก็ตามในทางกลับกันวิธีที่จะควบคุมผลลัพธ์ ก่อนที่กระบวนการต่างๆจะเสร็จสมบุรณ์ กรุณาดูรายการเมธอดที่มีได้ที่ Output Class
ฟังก์ชันส่วนตัว
ในบางกรณีคุณอาจจะต้องการให้ฟัังก์ชันของคุณถูกซ่อนไว้ ซึ่งจะเข้าถึงจากภายนอกไม่ได้ และเพื่อทำให้เป็นแบบนี้ ง่ายๆเลยคุณเติมเครื่องหมาย _ (underscore) เข้าด้านหน้าของชื่อฟังก์ชันนั้น ซึ่งมันจะไม่ถูกให้บริการผ่านการร้องขอทาง URL ถ้าคุณมีฟังก์ชันคล้ายๆแบบนี้: function _utility()
{
// some code
}
แล้วถ้าคุณลองเข้าโดยพิมพ์ URL แบบด้านล่างนี้ มันก็จะเข้าไม่ได้example.com/index.php/blog/_utility/
หรือจะใช้วิธีแบบเดิมของการเขียน PHP ก็ทำได้โดยprivate function utility()
{
// some code
}
จัดระบบ Contoller (ตัวควบคุม) ต่างๆแบบโฟลเดอร์ย่อย
ถ้าคุณทำงานกับแอพพลิเคชันที่ขนาดใหญ่ มันจะสะดวกกว่าถ้าคุณจะแบ่ง controller (ตัวควบคุม)ของคุณออกเป็นโฟลเดอร์ย่อยๆ CodeIgniter ยอมให้ทำเช่นนั้นได้
ง่ายๆเลยก็คือคุณสร้า้งโฟลเดอร์ไว้ข้างใน application/controllers แล้วสร้าง controller (ตัวควบคุม) ของคุณไว้ในโฟลเดอร์นี้
หมายเหตุ:ถ้าคุณใช้แบบส่วนแรกของ URI คุณต้องระบุชื่อโฟลเดอร์นั้นด้วย ตัวอย่าง, สมมติว่าคุณมี controller (ตัวควบคุม) ที่อยู่ใน:application/controllers/products/shoes.php
เพื่อเรียก controller (ตัวควบคุม) ดังแบบด้านบน URI ของคุณจะมีลักษณะดังนี้:example.com/index.php/products/shoes/show/123
โฟลเดอร์ย่อยแต่ละอันของคุณอาจจะมี controller (ตัวควบคุม) แบบปริยาย(เรียกโดยอัติโนมัติ) ซึ่งจะถูกเรียกเมื่อมีการทำงานของโฟลเดอร์นั้นๆ ชื่อของ controller (ตัวควบคุม) แบปริยาย(เรียกโดยอัติโนมัติ) แบบง่ายๆที่จะระบุในไฟล์ application/config/routes.php
CodeIgniter ยอมให้คุณกำหนดเส้นทางใหม่ให้กับ URI ของคุณโดยใช้ URI Routing
Class Constructors (ตัวสร้างคลาส)
ถ้าคุณตั้งใจที่จะใช้ constructor (ตัวสร้าง) ใน controler (ตัวควบคุม)ของคุณ คุณต้องต้องนำโค้ดข้างล่างนี้ไปวางไว้ใน constructor (ตัวสร้าง)ของคุณ:parent::Controller();
เหตุผลที่โค้ดนี้จำเป้นก็เพาะว่า constructor (ตัวสร้าง) ของคุณจะทับ constructor (ตัวสร้าง) ของคลาสแม่ ดังนั้นเราจึงต้องเรียก constructor (ตัวสร้าง) ของคลาสแม่เอง
ถ้าคุณยังไม่คุ้นเคยกับ constructor (ตัวสร้าง) สักเท่าไหร่ ใน PHP 4 ,constructor (ตัวสร้าง) นั้นจะมีชื่อเหมือนกับชื่อคลาส: <?php
class Blog extends Controller {
function Blog()
{
parent::Controller();
}
}
?>
ใน PHP5, constructor (ตัวสร้าง) จะใช้รูปแบบดังนี้: <?php
class Blog extends Controller {
function __construct()
{
parent::Controller();
}
}
?>
Constructor (ตัวสร้าง)ต่างๆ เมื่อคุณต้องการการทำงานโดยอัติโนมัติตอนเริ่มต้นมันจะมีประโยชน์มาก หรือจะใช้ให้กระบวนการบางอย่างในคลาสทำงานโดยอัติโนมัติ constructor (ตัวควบคุม)นั้นมันไม่สามารถคืนค่าใดๆออกมาได้ มันแค่เอาไว้ทำงานโดยอัติโนมัติตอนเริ่มต้นเท่านั้น
ชื่อฟังก์ชันสงวน
เมื่อ controller (ตัวควบคุม)ของคุณได้ขยายมากจาก controller (ตัวควบคุม) ของระบบ คุณต้องแน่ใจว่าชื่อฟังก์ชันของคุณจะไม่ไปซ้ำกับฟังก์ชันของคลาสระบบ มิฉะนั้นฟังก์ชันของคุณจะไปทับกับฟังก์ชันของระบบเอาซะ ดูรายชื่อคำสงวน (Reserved Names) ทั้งหมด
นั่นแหละ!
ทั้งหมดนั้นเป็นข้อมูลสรุปคร่าวๆของ controller (ตัวควบคุม)