คู่มือการใช้งาน CodeIgniter เวอร์ชั่น 1.7.2


Controllers (ตัวควบคุม)

Controllers (ตัวควบคุม) เป็นหัวใจของแอพพลิเคชันของคุณเลยทีเดียว, เนื่องจากมันเป็นตัวกำหนดว่าการร้องขอ HTTP ใดควรจะถูกกระทำ(ตอบสนอง)อย่างไร

อะไรคือ 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 (ตัวควบคุม)