ข้อควรรู้เบื้องต้น เกี่ยวกับ CodeIgniter 4

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

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



ก่อนจะลงไปในรายละเอียดการใช้งานเพิ่มเติม
ของ CodeIgniter 4 จะขอสรูปการเปลี่ยนแปลง
ของเวอร์ชั่นจาก CodeIgniter 3 ดังรายละเอียดต่อไปนี้
    * ขอเรียกเป็นคำย่อ "CI แทนคำว่า CodeIgniter"
 
 

เกี่ยวกับ CodeIgniter 4

CI4 เป้นการเขียนขึ้นมาใหม่ และไม่รองรับการใช้งานกับเวอร์ชั่นก่อนหน้า ดังนั้นการอัพเกรตจากโค้ดเดิม
จึงไม่ใช่วิธีที่เหมาะสม ดังนั้นควรจะเปลี่ยนมาใช้งานใหม่ทั้งหมดแทน
    การศึกษา และทำความเข้าใจกับรูปแบบการใช้งานจะยังคงคล้ายๆ กับ CI3 แต่ส่วนเพิ่มเติมเข้ามาก็จะ
มีหลายๆ ส่วนที่แตกต่างจาก CI3
    การติดตั้งและใช้งาานสามารถทำได้ทั้งดาวน์โหลดไฟล์ zip มาใช้งาน แตกไฟล์และกำหนดค่าต่างๆ ด้วย
ตัวเอง หรือจะใช้งานผ่าน composer ก็สะดวก และเหมาะสำหรับต้องการอัพเดทเวอร์ชั่นใหม่ๆ 
 
ใน CI4 จะเรียกใช้งาน class ผ่าน Namespaces ยกเว้นในส่วนของ helper
 

โครงสร้าง Application ของ CodeIgniter 4

    การเปลี่ยนแปลงที่เกิดขึ้น จาก CI3 เป็น CI4 ประกอบด้วยส่วนต่างๆ ดังนี้
 
    โฟลเดอร์ "application" เปลี่ยนชื่อมาเป็น "app"  ยังมีการใช้งานโฟลเดอร์ "system" เหมือนเดิม
    มีการใช้งานโฟลเดอร์ "public" เสมือนเป็น document root หลักของ web app
    มีการใช้งานโฟลเดอร์ "writable" สำหรับเก็บข้อมูล cache logs และ ข้อมูล session กรณีเก็บเป็นไฟล์
    โฟลเดอร์ย่อยใน "app" จะคล้ายๆ กับของ CI3 แต่จะมีบางโฟลเดอร์ถูกย้ายไปไว้ใน "writable"
    ไม่มีการใช้งานโฟลเดอร์ "application/core" 
    
 

การเรียกใช้งาน Class

    ไม่มีการใช้งาน "superobject" เหมือนใน CI3
    การกำหนดค่าเริ่มต้นของ class ที่จำเป็นต้องใช้งาน รวมถึง component จะภุกจัดการด้วย "Services"
    ตัวเรียกใช้งาน class ทำงานอัตโนมัติผ่านรูปแบบ PSR4 
    ยังสามารถกำหนดเรียกใช้งาน class ในรูปแบบที่ต้องการเองได้ รวมถึงการใช้งานในรูปแบบ "HMVC"
 

การใช้งาน Controllers

    สืบทอด Controller class จาก  \CodeIgniter\Controller  แทน CI_Controller
    ไม่มีการใช้งานส่วนของ constructor เว้นแต่จะเป็นการกำหนดใช้งานเองจากผู้ใช้
    มีการใช้งาน "Request" และ "Response" Object ซึ่งมีประโยชน์มากกว่าในรูปแบบที่ใช้กับ CI3
    เรายังสามารถกำหนด Controller ในรุปแบบเดียวกับ CI3 โดยสืบทอดจาก \CodeIgniter\Controller ก่อน
    รูปแบบเดียวกับที่กำหนดใน BaseController
 

การใช้งาน Models

    สืบทอด Models class จาก \CodeIgniter\Model แทน CI_Model
    ใน CI4 ตัว Model จะมีความสามารถมากขึ้น รวมถึงการเชื่อมต่อกับฐานข้อมูลโดยอัตโนมัติ การตรวจสอบการ
เพิ่ม ลบ แก้ไขข้อมูล และการจัดการแบ่งหน้ารายการ
    ใน CI4 มีการใช้งาน "Entity" class ที่ช่วยให้สามารถกำหนดรูปแบบโครงสร้างการจัดการกับตารางในฐานข้อมูล
กับข้อมูลที่จะใช้งานได้
    เรียกใช้งานด้วยรูปแบบ $this->x = new X(); แทนรูปแบบเดิมใน CI3 ซึ่งใช้เป็น $this->load->model(x);
 

การใช้งาน Views

    การใช้งาน view แทบจะเหมือนรูปแบบเดิมใน CI3 แต่มีการเรียกใช้เป็น echo view(x); แทน $this->load->view(x);
    มีการใช้งาน "cells" ในการสร้างการแสดงผลส่วนย่อย
    ยังรองรับการใช้งาน template และปรับประสิทธิภาพให้ทำงานได้ดีขึ้น
 

การใช้งาน Libraries

    เรายังสามารถกำหนด และใช้งาน class ในโฟลเดอร์ "app/Libraries" แม้ว่าใน CI4 จะไม่มีการเรียกใช้แล้วก็ตาม
    รูปแบบการเรียกใช้จะเป็น $this->x = new X(); แทนรูปแบบใน CI3 ที่เป็น $this->load->library(x);
 

การใช้งาน Helpers

    มีรูปแบบเหมือนใน CI3 และบางรายการ อาจจะมีรูปแบบการใช้งานง่ายขึ้น
 

การใช้งาน Evens

    มีการใช้งาน Events แทนรูปแบบทำงานที่เกิดขึ้นสัมพันธ์กันหรือ Hook
    ใช้รูปแบบ Events::on('post_controller_constructor', ['MyClass', 'MyFunction']); ผ่าน namespace ชื่อ
    CodeIgniter\Events\Events; แทนรูปแบบของ CI3     ซึ่งใช้เป็น $hook['post_controller_constructor'] 
    Events จะถูกเปิดใช้งานเสมอ และมีรูปแบบเป็น global
 
 

 

โครงสร้าง CodeIgniter 4

    ในการใช้งาน CI4 เราจำเป็นต้องรู้ถึงโครงสร้างของ Application  ต้องรู้ว่าเราสามารถปรับ เปลี่ยน หรือแก้ไข
ส่วนใด ของ app ได้บ้าง
 

    ส่วนของโฟลเดอร์เริ่มต้นหลัก

    จะประกอบไปด้วย /app , /system , /public , /writable , /tests และ อาจจะมีโฟลเดอร์ /docs
    ในกรณีติดตั้งผ่าน composer โฟลเดอร์ /system จะอยู่ใน /vendor/codeigniter4/framework
 
 

    โฟลเดอร์ app

    สำหรับโฟลเดอร์ app จะเป็นที่เก็บโค้ดหลักส่วนใหญ่ ประกอบด้วยโฟลเดอร์พื้นฐาน ที่ทำงานและทำหน้าที่ต่างๆ
ใน app ของเรา ดังแสดงรายละเอียด และคำอธิบายดังนี้
 
/app
        /Config         เก็บในส่วนไฟล์ตั้งค่าต่างๆ
        /Controllers    เก็บไฟล์ Controllers กำหนดและควบคุมการทำงานของ app
        /Database      เก็บข้อมูลตั้งค่าการเชื่อมต่อฐานข้อมูล
        /Filters        เก็บ filter classes ที่สามารถทำงาน ก่อน และ หลัง controller
        /Helpers        เก็บฟังก์ชั่นช่วยเหลือต่างๆ ที่สามารถเรียกใช้งานได้ง่าย
        /Language      เก็บส่วนกำหนดข้อความกำหนดภาษา
        /Libraries      เก็บ class ที่ต้องการใช้งาน และไม่ได้อยู่ในส่วนจัดการอื่น
        /Models        เก็บไฟล์จัดการข้อมูลร่วมกับ database
        /ThirdParty    เก็บ libraries จากภายนอกที่ต้องการนำมาใช้งานใน app
        /Views          เก็บไฟล์โครงสร้าง HTML สำหรับใช้ในการแสดงผล
 
    ไฟล์ต่างๆ ที่อยู่ในโฟลเดอร์นี้ จะอยู่ภายใต้ namespace ที่ชื่อว่า "app" ซึ่งกำหนดในไฟล์ app/Config/Constants.php
 
 

    โฟลเดอร์ system

    เป็นโฟลเดอร์สำหรับไฟล์ที่ใช้ในการสร้าง CI4 เราไม่จำเป็นต้องแก้ไขใดๆ กำหนดไฟล์ในส่วนนี้ กรณีต้องการใช้งาน
บางอย่างเพิ่มเติม ควรใช้วิธีสืบทอด class หรือสร้าง class ใหม่ขึ้นมาใช้งาน 
    ไฟล์ต่างๆ ที่อยู่ในโฟลเดอร์นี้ จะอยู่ภายใต้ namespace ที่ชื่อว่า "CodeIgniter"
 
 

    โฟลเดอร์ public

    เป็นส่วนที่เราอนุญาตให้บราวเซอร์สามารถเข้าถึง web app ของเราได้ เพื่อป้องกันการเข้าถึงโค้ดส่วนอื่น โดยจะมีไฟล์
.htaccess file, index.php และไฟล์ที่เราเรียกใช้งานเพิ่มเติมอื่นที่เราเพิ่มเข้ามา เช่น CSS Javascript หรือ รูปภาพ เป็นต้น
    โฟลเดอร์นี้เปรียบเสมือนเป็น web root ของเว็บไซต์ของเรา และในการตั้งค่า server เราควรทำการชี้ domain มายัง
โฟลเดอร์นี้เพื่อใช้งาน
 
 

    โฟลเดอร์ writable

    เป็นโฟลเดอร์สำหรับเก็บโฟลเดอร์ย่อย ที่เราอาจจะจำเป็นต้องมีการเขียนไฟล์เกิดขึ้นในการใช้งาน app เช่น cache
logs หรือโฟลเดอร์ที่อัพโหลดโดยผู้ใช้ เราสามารถเพิ่มโฟลเดอร์ต่างๆในนี้ ตามการใช้งาน เช่นเก็บรูปสินค้าอาจจะกำหนด
โฟลเดอร์ชื่อ product เป็นต้น เหตุผลหลักของการกำหนดโฟลเดอร์ที่สามารถเขียนได้ในโฟลเดอร์ writable ก็เพื่อป้องกัน
โฟลเดอร์อื่นๆ ซึ่งไม่สามารถเขียนได้มีความปลอดภัยยิ่งขึ้น
 
 

    โฟลเดอร์ tests

    เป็นโฟลเดอร์สำหรับเก็บไฟล์ข้อมูลทดสอบ เช่น mook class หรือ class ข้อมูลจำลองสำหรับทดสอบ รวมถึงเครื่องมือ
อื่นๆ ที่ต้องการใช้งานในระหว่างทดสอบ โฟลเดอร์นี้ไม่จำเป็นต้องอัพโหลดขึ้น server
 
 

    โฟลเดอร์ docs

    เป็นโฟลเดอร์เก็บคู่มือการใช้งาน CI4
 
 

    การปรับแต่งหรือเปลียนชื่อโฟลเดอร์

    ในกรณีที่ต้องการปรับแต่งชื่อโฟลเดอร์ สามารถกำหนดได้ในไฟล์ app/Config/Paths ซึ่งเราสามารถเปลี่ยนค่าค่างๆ
เหล่านี้ได้ เช่นอาจจะอยากเปลี่ยนโฟลเดอร์ writable กับ Views ไปที่โฟลเดอร์อื่น เป็นต้น
 
public $systemDirectory = __DIR__ . '/../../vendor/codeigniter4/framework/system';
public $appDirectory = __DIR__ . '/..';
public $writableDirectory = __DIR__ . '/../../writable';
public $testsDirectory = __DIR__ . '/../../tests';
public $viewDirectory = __DIR__ . '/../Views';
 
 
 

รู้จักกับ Models , Views และ Controllers

    ใน CI4 ใช้รูปแบบการจัดการไฟล์เป็น MVC ซึ่งเป็นการกำหนดข้อมูล การแสดง และรูปแบบลำดับขั้นตอนการทำงาน
ของโปรแกรมแยกเป็นไฟล์แต่ละส่วน อย่างไรก็ตาม เราก็สามารถที่จัดรูปแบบหรือกำหนดเองตามต้องการได้ โดยไม่จำเป็น
จะต้องเหมือนกับรูปแบบของ CI4 กำหนดมาให้ทั้งหมด ทั้งนี้ก็ขึ้นอยู่กับความเหมาะสมด้วย
 
    Models         ใช้จัดการข้อมูลของ app เช่นการเพิ่ม ลบ แก้ไขข้อมูลในฐานข้อมูล และอาจจะมีการกำหนดเงือ่นไข
                         หรือทิศทางการทำงานของโปรแกรมในลักษณะคล้ายกับ controller บ้างในบางกรณี
    Views           เป็นไฟล์สำหรับกำหนดรุปแบบการแสดง จะใช้เป็นโครงสร้างไฟล์ HTML เป็นส่วนใหญ่
    Controllers  เป็นเสมือนตัวเชื่อมการทำงานระหว่าง models กับ views ที่รับข้อมูลมาจาก models แล้วส่งต่อไปยังส่วน
                         แสดงผลใน views
 
    ในรูปแบบทั่วไปแล้ว controller และ model จะเป็นการใช้งานในรูปแบบ class ที่กำหนดการทำงานเฉพาะไว้ จะกำหนดการ
ใช้งานไว้อยู่ในโฟลเดอร์ /app อย่างไรก็ตาม เราสามารถจะกำหนดไว้ที่อื่นๆ ใดๆ ก็ได้ ขึ้นกับการกำหนด namespace ที่ต้อง
สัมพันธ์กัน แต่ในที่นี้เรายึดรูปแบบโครงสร้างของ CI4 เป็นหลัก
    มาดูแต่ละส่วนโดยละเอียดเพิ่มเติมเล็กน้อย ดังนี้
 

    Views 

    โดยทั่วไปแล้วจะเป็นไฟล์ HTML ที่ใช้งานร่วมกับคำสั่ง PHP แบบง่าย โดยส่วนใหญ่ก็จะเป็นการแสดงข้อมูลจากตัวแปร
ที่ถูกส่งมาใช้งาน หรือการวนลูปแสดงรายการข้อมูลในตาราง เหล่านี้เป็นต้น
    โดย views จะทำการนำข้อมูลที่ได้จาก controller ซึ่งถูกส่งผ่านมาในรูปแบบตัวแปร แล้วนำมาแสดงด้วยรูปแบบคำส่ง
ง่ายๆย อย่าง echo  เราสามารถกำหนดหรือแสดง view ซ้อน view ได้ เช่นกับการกำหนด header หรือ footer ที่ทำการ
แสดงซ้ำๆ ในหลายๆ หน้า
    ไฟล์เกี่ยวกับ views จะเก็บไว้ที่โฟลเดอร์ /app/Views และวิธีการที่เหมาะสมก็คือควรสร้างเป็นโฟลเดอร์ย่อยๆ แยกตาม
controller ที่ใช้งานไว้ในโฟลเดอร์ /Views อีกที โดยกำหนดชื่อให้สัมพันธ์กันตามความเหมาะสม ยกตัวอย่างเช่น รายละเอียด
ข้อมูลผู้ใช้หรือ User ก็จะกำหนดใน controller ที่ชื่อ User มี method ที่ชื่อ profile  และกำหนดไฟล์ Views ไว้ในชื่อ
/app/Views/User/Profile.php แบบนี้เป็นต้น
 

    Models

    การทำงานของ model จะใช้สำหรับจัดการกับข้อมูลภายใน app เช่น ข้อมูลการโพสของผู้ใช้ อย่างไรก็ตาม การใช้งาน
model ก็อาจจะเป็นได้ทั้งการกำหนดเงื่อนไขที่คล้ายกับ controller ร่วมกับการจัดการข้อมุลก็ได้ ยกตัวอย่าง การรับข้อมูล
มาจากผู้ใช้จากนั้นทำการบันทึกลงฐานข้อมูล เสร็จแล้วกำหนดรูปแบบที่จะส่งกลับข้อมูลออกมาใช้าน หากเป็นกรณีที่จำเป็น
ต้องการแสดงข้อมูลนั้นๆ 
    หลายคนอาจจะสับสนกับรูปแบบเงื่อนไขที่จะใช้ร่วมกับ model ในความหมายอย่างง่ายก็คือ ข้อจำกัดหรือความต้องการใดๆ
ของข้อมูลนั้้นๆ จะจัดการผ่าน model อาจจะรวมถึงข้อมูลก่อนที่จะบันทึก หรือข้อมูลก่อนที่จะถูกส่งต่อไปยัง controller หากเรา
เข้าใจหลักกการกำหนดนี้ ใน model ก็จะช่วยให้ไม่จำเป็นต้องกำหนดโค้ดซ้ำๆ เป็น controller ย่อย จนอาจจะลืมการปรับหรือ
เปลี่ยนค่าในบางส่วนใน cotroller ได้
    ไฟล์เกี่ยวกับ models จะเก็บไว้ที่โฟล์เดอร์ /app/Models
 

    Controllers

    การใช้งาน controller อาจจะมีรูปแบบกฏการใช้งานใน 2 ลักษณะ ลักษณะแรกที่พอจะเห็นได้ชัดก็คือการรับข้อมูล
จากผู้ใช้แล้วกำหนดเงื่อนไขว่าจะจัดการ หรือใช้งานกับข้อมูลนั้นๆ อย่างไร ซึ่งโดยทั่วไปก็จะทำการส่งต่อข้อมูลไปจัดการต่อ
ในส่วนของ model เพื่อบันทึก หรือรับค่าจาก model ส่งไปต่อไปแสดงผลยังส่วนของ view  การใช้งาน controller ส่วนใหญ่
ก็มักจะมีการเรียกใช้ class อื่นๆ เข้ามาช่วนเพิ่มเติมถ้าจำเป้น เพื่อทำงานพิเศษบางอย่าง ที่ไม่สามารถจัดการผ่าน model ปกติ
    อีกหน้าที่หนึ่งของ controller ก็คือการจัดการทุกๆ สิ่งที่เกี่ยวกับ HTTP Request อย่างการเปลี่ยนหน้า app  การกำหนด
สิทธิ์การเข้าใช้งาน การกำหนดความปลอดภัยของเว็บ การเข้ารหัส เหล่านี้เป็นต้น  หรือสั้นๆ ก็คือ controller ใช้สำหรับกำหนด
ว่าสามารถเข้าถึง หรือใช้งานส่วนนั้นได้หรือไม่ และนำข้อมูลในรูปแบบที่ต้องการไปใช้งาน
    ไฟล์เกี่ยวกับ controllers จะเก็บไว้ที่โฟลเดอร์ /app/Controllers
 
 

การ Autoloading Files

    ใน application ที่มีการเรียกใช้งาน class จำนวนมากๆ จากไฟล์หลายๆที่ แตกต่างกัน ส่วนใหญ่แล้วตัว framework จะทำ
การกำหนดให้มีฟังก์ชั่นเฉพาะไว้ใช้งานเพื่อจัดการกับ class ต่างๆ เหล่านั้น  App ของเราอาจจะมีได้ทั้ง Libraries , models
และ รายการอื่นๆ เพื่อใช้ประกอบการทำงาน บางกรณีเราอาจจำเป็นต้องใช้ libraries จากภายนอก เหล่านี้จึงเป็นเหตุผลจำเป็น
ที่จะต้องมีตัว autoloaders
    CI4 มีความยืดหยุุ่นในการกำหนดใช้งาน autoloader โดยมีวิธีการปรับเล็กน้อย สามารถใช้ได้ทั้งแบบไม่มีกำหนด namespace
หรือ แบบ namespace ในรูปแบบ PSR4 ก็ได้ ซึ่งทำงานในลักษณะคล้ายกับการทำงานของส่วน Controller และ Model
    นอกจากนั้น เพื่อประสิทธิภาพการทำงาน CI4 ยังรองรับการกำหนด autoloader ในลักษณะของ classmap อีกด้วย ซึ่งจะช่วย
ให้เข้าถึง class ที่จะใช้งานโดยไม่ต้องไล่ค้นหาตามชื่อโฟลเดอร์หรือ namespace 
 

    การตั้งค่า

    เราสามารถตั้งค่า autoload ทั้งแบบ namespace แบบบ PSR4 และ แบบ classmap 
    ได้ที่ไฟล์ /app/Config/Autoload.php
 

    การกำหนด Namespaces

    วิธีการจัดการกับ class ที่แนะนำก็คือการกำหนดหรือสร้าง namespace สำหรับ application ตัวอย่างการกำหนดข้างล่าง
เป็นรูปแบบการจับคู่ namespace กับโฟลเดอร์ที่เก็บ class ไว้ใช้งาน
 
$psr4 = [
    'App'         => APPPATH,
    'CodeIgniter' => SYSTEMPATH,
];
 
 
  โดยค่า key แต่ละตัว ก็คือชื่อของ namespace ในตัวอย่างด้านบนก็คือ "App" และ "CodeIgniter"  กรณีกำหนดโดยใช้
single-qoute หากมี subnamespace ก็สามารถใช้เป็น 'My\App' แต่ถ้ากำหนดโดยใช้ double-qoute เราจะต้องป้องกัน
การกำหนดเครื่อง \ เพิ่มเข้าไป เป็นดังนี้ "My\\App" 
 
    ค่าเริ่มต้นแล้ว โฟลเดอร์ application จะใช้ namespace เป็น "app" แต่หากต้องเปลี่ยน สามารถกำหนดในไฟล์
     /app/Config/Constants.php
 
 

    การกำหนด Classmap

    การใช้งาน classmap เป็นส่วนเสริมเพิ่มเติมของ CI4 ที่ไม่ต้องการให้การเรียกใช้งานในส่วนเพิ่มเติมเล็กน้อย ไม่จำเป็น
จะต้องทำผ่านระบบการค้นหาใน file-system  เราสามารถกำหนด ชื่อ class ที่จะใช้งานจับคุู่กับ path ของไฟล์ที่จะเรียกใช้
ที่ไม่มีการกำหนด namespace ตามตัวอย่างด้านล่าง 
 
$classmap = [
    'Markdown' => APPPATH .'third_party/markdown.php'
];

    ใน CI4 ยังรองรับในการกรณีที่เมื่อการเรียกใช้งาน class ทั้งแบบ PSR4 และ classmap แล้วไม่พบไฟล์ดังกล่าวตามระบุ
ก็จะไปทำการหาเพิ่มเติมในโฟลเดอร์ /app/Libraries และ /app/Models เพื่อที่จะระบุตำแหน่งของไฟล์ที่เรียกใช้เพิ่มเติม
 
 
    เนื้อหาเกี่ยวกับการทำความรู้จัก CodeIgniter 4 เบื้องต้น จะมีต่อให้ตอนหน้า รอติดตาม


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



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









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






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

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

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

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



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




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











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