Fri. Feb 28th, 2025
CodeIgniter และระบบ Auto RoutingCodeIgniter และระบบ Auto Routing
Spread the love

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

  1. ความปลอดภัย
  • Auto routing อาจทำให้เข้าถึง methods ที่ไม่ต้องการให้เข้าถึงได้
  • ควรใช้ filters หรือ access controls เพื่อป้องกัน
  1. การตั้งชื่อ Method
  • Methods ที่ขึ้นต้นด้วย underscore (_) จะไม่สามารถเข้าถึงผ่าน URL ได้
  • ควรใช้สำหรับ private methods
  1. Performance
  • Auto routing ต้องค้นหา controller และ method ตาม URL
  • อาจช้ากว่าการกำหนด routes แบบ manual เล็กน้อย

แนวทางการใช้งานที่แนะนำ

  1. สำหรับโปรเจคขนาดเล็ก
  • เปิดใช้ Auto Routing เพื่อความสะดวก
  • ใช้ filters สำหรับการควบคุมการเข้าถึง
  1. สำหรับโปรเจคขนาดใหญ่
  • ปิด Auto Routing
  • กำหนด Routes แบบ manual
  • ใช้ Route Groups จัดการ URLs
  1. การจัดการ Security
// ตั้งค่า private methods
class Blog extends BaseController
{
    private function _updateStats()
    {
        // method นี้ไม่สามารถเข้าถึงผ่าน URL ได้
    }
}

// ใช้ filters สำหรับการควบคุมการเข้าถึง
$routes->get('admin/*', 'Admin\Dashboard::index', ['filter' => 'auth']);

Loading

By tikky

Leave a Reply

Your email address will not be published. Required fields are marked *