CodeIgniter คืออะไร?
CodeIgniter (CI) เป็น PHP Framework ที่มีขนาดเบา รวดเร็ว และใช้งานง่าย โดยใช้รูปแบบ MVC (Model-View-Controller) ในการพัฒนา เหมาะสำหรับการพัฒนาเว็บแอปพลิเคชันทั้งขนาดเล็กและขนาดกลาง
การติดตั้ง CodeIgniter
# ใช้ Composer composer create-project codeigniter4/appstarter project-name # หรือดาวน์โหลดจาก website # https://codeigniter.com/download
โครงสร้างโฟลเดอร์พื้นฐาน
project/ ├── app/ │ ├── Config/ │ ├── Controllers/ │ ├── Models/ │ └── Views/ ├── public/ ├── system/ └── writable/
Auto Routing ใน CodeIgniter 4
1. Auto Routing Legacy (แบบเดิม)
// app/Config/Routes.php $routes->setAutoRoute(true);
การทำงานของ Auto Routing แบบเดิม:
URL: example.com/products/show/123 จะถูกแปลงเป็น: Controller: Products Method: show Parameter: 123
2. Auto Routing Improved (แบบใหม่ใน CI4)
// app/Config/Routing.php public bool $autoRoute = true;
ตัวอย่าง Controller:
// app/Controllers/Blog.php namespace App\Controllers; class Blog extends BaseController { public function index() { return view('blog/list'); } public function show($id) { return view('blog/detail', ['id' => $id]); } public function category($type, $id) { return "Category: $type, ID: $id"; } }
รูปแบบ URL ที่จะทำงาน:
/blog -> Blog::index() /blog/show/123 -> Blog::show(123) /blog/category/news/5 -> Blog::category('news', 5)
การกำหนด Routes แบบ Manual
1. Routes พื้นฐาน
// app/Config/Routes.php $routes->get('/', 'Home::index'); $routes->get('blog', 'Blog::index'); $routes->get('blog/(:num)', 'Blog::show/$1'); $routes->post('blog/create', 'Blog::create');
2. Routes แบบมีเงื่อนไข
// Routes with constraints $routes->get('users/(:num)', 'Users::show/$1'); $routes->get('blog/(:alpha)', 'Blog::category/$1'); $routes->get('posts/(:segment)', 'Posts::view/$1');
3. Routes Groups
$routes->group('admin', ['filter' => 'auth'], function($routes) { $routes->get('users', 'Admin\Users::index'); $routes->get('posts', 'Admin\Posts::index'); $routes->get('settings', 'Admin\Settings::index'); });
ตัวอย่างการใช้งาน Controller กับ Auto Routing
1. Controller พื้นฐาน
namespace App\Controllers; class Product extends BaseController { public function index() { // แสดงรายการสินค้าทั้งหมด return view('products/list'); } public function show($id) { // แสดงรายละเอียดสินค้า $model = new \App\Models\ProductModel(); $data['product'] = $model->find($id); return view('products/detail', $data); } public function create() { // แสดงฟอร์มสร้างสินค้า return view('products/create'); } public function store() { // บันทึกข้อมูลสินค้า $model = new \App\Models\ProductModel(); $data = $this->request->getPost(); if ($model->save($data)) { return redirect()->to('/products'); } } }
2. การใช้ Filters กับ Auto Routing
// app/Filters/AuthFilter.php namespace App\Filters; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use CodeIgniter\Filters\FilterInterface; class AuthFilter implements FilterInterface { public function before(RequestInterface $request, $arguments = null) { if (!session()->get('logged_in')) { return redirect()->to('/login'); } } public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) { // ทำงานหลังจาก controller ทำงานเสร็จ } }
3. การกำหนด Filters ใน Routes
// app/Config/Filters.php public $filters = [ 'auth' => \App\Filters\AuthFilter::class ]; // app/Config/Routes.php $routes->get('admin/*', 'Admin\Dashboard::index', ['filter' => 'auth']);
ข้อควรระวังในการใช้ Auto Routing
- ความปลอดภัย
- Auto routing อาจทำให้เข้าถึง methods ที่ไม่ต้องการให้เข้าถึงได้
- ควรใช้ filters หรือ access controls เพื่อป้องกัน
- การตั้งชื่อ Method
- Methods ที่ขึ้นต้นด้วย underscore (_) จะไม่สามารถเข้าถึงผ่าน URL ได้
- ควรใช้สำหรับ private methods
- Performance
- Auto routing ต้องค้นหา controller และ method ตาม URL
- อาจช้ากว่าการกำหนด routes แบบ manual เล็กน้อย
แนวทางการใช้งานที่แนะนำ
- สำหรับโปรเจคขนาดเล็ก
- เปิดใช้ Auto Routing เพื่อความสะดวก
- ใช้ filters สำหรับการควบคุมการเข้าถึง
- สำหรับโปรเจคขนาดใหญ่
- ปิด Auto Routing
- กำหนด Routes แบบ manual
- ใช้ Route Groups จัดการ URLs
- การจัดการ Security
// ตั้งค่า private methods class Blog extends BaseController { private function _updateStats() { // method นี้ไม่สามารถเข้าถึงผ่าน URL ได้ } } // ใช้ filters สำหรับการควบคุมการเข้าถึง $routes->get('admin/*', 'Admin\Dashboard::index', ['filter' => 'auth']);