CodeIgniter là một framework PHP mã nguồn mở, tập trung vào hiệu năng và tính đơn giản, phù hợp với các dự án web vừa và nhỏ yêu cầu triển khai nhanh, bảo trì dễ dàng. Khác biệt nổi bật của nó nằm ở việc không bắt buộc sử dụng các thành phần nặng như ORM phức tạp hay hệ thống DI container — thay vào đó, framework cung cấp một lớp nền mỏng, linh hoạt và kiểm soát cao từ phía lập trình viên.
Đặc điểm kiến trúc nổi bật
- Tối ưu tải – Không phụ thuộc vào autoloader nặng: Core chỉ gồm ~20 file PHP, khởi tạo trong vòng vài mili giây.
- MVC thuần túy nhưng không cứng nhắc: Cho phép bỏ qua mô hình nếu cần (ví dụ: xử lý trực tiếp trong controller), đồng thời hỗ trợ modularization qua thư mục
app/Modules(từ phiên bản 4.x trở đi). - Hệ thống routing động: Hỗ trợ cả pattern-based routing (
$routes->add('shop/(:any)', 'Shop::show/$1')) và closure-based routes. - Database layer đa nền tảng: Tương thích MySQLi, PostgreSQL, SQLite3, SQLSRV — tự động chuyển đổi câu truy vấn khi thay đổi driver.
- Bảo mật tích hợp: Cơ chế escaping mặc định cho tất cả hàm
esc(), hỗ trợ CSRF token trong form, và khả năng thiết lập content security policy (CSP) qua config. - Helper & Library phong phú: Từ
url_helper,form_helperđếnencryption,pagination— đều được thiết kế để gọi ngay lập tức mà không cần khởi tạo đối tượng.
Ví dụ thực tế: Hệ thống cửa hàng sản phẩm cơ bản
Dưới đây là cách triển khai module Product trong CodeIgniter 4, được viết lại hoàn toàn để đảm bảo tính độc lập, rõ ràng và tuân thủ best practices hiện đại:
// app/Config/Routes.php
$routes->get('products', 'ProductController::index');
$routes->get('products/(:segment)', 'ProductController::view/$1');
$routes->post('cart/add', 'CartController::addItem');
// app/Controllers/ProductController.php
productModel = new ProductModel();
}
public function index()
{
$data['items'] = $this->productModel->findAll();
return view('pages/product_catalog', $data);
}
public function view(string $slug)
{
$item = $this->productModel->where('slug', $slug)->first();
if (!$item) {
throw new \CodeIgniter\Exceptions\PageNotFoundException("Sản phẩm không tồn tại");
}
return view('pages/product_detail', ['item' => $item]);
}
}
<div class="catalog">
<?php foreach ($items as $p): ?>
<article class="product-card">
<h3><?= esc($p['name']) ?></h3>
<p><?= ellipsize(esc($p['description']), 120) ?></p>
<a href="/products/<?= esc($p['slug']) ?>" class="btn">Xem chi tiết</a>
</article>
<?php endforeach; ?>
</div>
<main class="product-page">
<h1><?= esc($item['name']) ?></h1>
<img src="/uploads/<?= esc($item['image_path']) ?>" alt="<?= esc($item['name']) ?>" />
<p><?= nl2br(esc($item['description'])) ?></p>
<form action="/cart/add" method="post">
<input type="hidden" name="product_id" value="<?= esc($item['id']) ?>" />
<label for="quantity">Số lượng:</label>
<input type="number" name="quantity" min="1" value="1" required />
<button type="submit">Thêm vào giỏ</button>
</form>
</main>
Cấu trúc trên thể hiện rõ luồng điều khiển: request → route → controller → model → view, với từng thành phần có trách nhiệm riêng biệt. Việc sử dụng hàm esc() tự động xử lý output escaping, kết hợp với validation ở tầng controller hoặc model giúp giảm thiểu rủi ro XSS và injection. Ngoài ra, việc tách logic xử lý giỏ hàng sang CartController riêng biệt đảm bảo nguyên tắc single responsibility và khả năng tái sử dụng cao.