1. MVC là gì?
MVC là mô hình thiết kế chia ứng dụng thành ba thành phần chính:
- Model: Xử lý dữ liệu, tương tác với cơ sở dữ liệu, thực hiện các logic nghiệp vụ liên quan đến dữ liệu.
- View: Hiển thị dữ liệu ra giao diện người dùng. View không chứa logic nghiệp vụ phức tạp.
- Controller: Tiếp nhận request từ người dùng, điều phối giữa Model và View, xử lý logic điều hướng.
Luồng hoạt động cơ bản: Người dùng gửi request → Controller tiếp nhận → Controller gọi Model để lấy/xử lý dữ liệu → Controller truyền dữ liệu sang View → View hiển thị kết quả về người dùng.
2. Cấu trúc thư mục MVC trong CodeIgniter 4
CodeIgniter 4 tổ chức các thành phần MVC trong thư mục app/:
app/
├── Controllers/
│ └── Blog.php
├── Models/
│ └── BlogModel.php
├── Views/
│ └── blog/
│ ├── index.php
│ └── detail.php
└── Config/
└── Routes.php
3. Controller trong CodeIgniter 4
Controller là nơi tiếp nhận request. Mỗi controller là một class kế thừa từ BaseController. Dưới đây là ví dụ controller quản lý blog:
<?php
namespace App\Controllers;
use App\Models\BlogModel;
class Blog extends BaseController
{
public function index()
{
$model = new BlogModel();
$data['posts'] = $model->getAllPosts();
$data['title'] = 'Danh sách bài viết';
return view('blog/index', $data);
}
public function detail($slug)
{
$model = new BlogModel();
$data['post'] = $model->getPostBySlug($slug);
if (empty($data['post'])) {
throw new \CodeIgniter\Exceptions\PageNotFoundException('Không tìm thấy bài viết');
}
return view('blog/detail', $data);
}
}
Trong ví dụ trên, controller Blog có hai phương thức:
index(): Lấy danh sách bài viết từ Model và truyền sang Viewblog/index.detail($slug): Lấy chi tiết bài viết theo slug, nếu không tìm thấy sẽ ném lỗi 404.
4. Model trong CodeIgniter 4
Model chịu trách nhiệm tương tác với cơ sở dữ liệu. CodeIgniter 4 cung cấp class Model với nhiều phương thức tiện ích như find(), findAll(), insert(), update(), delete().
<?php
namespace App\Models;
use CodeIgniter\Model;
class BlogModel extends Model
{
protected $table = 'posts';
protected $primaryKey = 'id';
protected $allowedFields = ['title', 'slug', 'content', 'author', 'created_at'];
protected $useTimestamps = true;
public function getAllPosts()
{
return $this->orderBy('created_at', 'DESC')->findAll();
}
public function getPostBySlug($slug)
{
return $this->where('slug', $slug)->first();
}
}
Model BlogModel định nghĩa bảng posts, các trường được phép ghi, và hai phương thức tùy chỉnh để lấy dữ liệu.
5. View trong CodeIgniter 4
View là file PHP hiển thị giao diện. CodeIgniter 4 sử dụng cú pháp PHP thuần kết hợp helper để render dữ liệu. Ví dụ view blog/index.php:
<!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<title><?= esc($title) ?></title>
</head>
<body>
<h1><?= esc($title) ?></h1>
<?php foreach ($posts as $post): ?>
<article>
<h2>
<a href="/blog/<?= esc($post['slug']) ?>">
<?= esc($post['title']) ?>
</a>
</h2>
<p><?= esc($post['author']) ?> - <?= esc($post['created_at']) ?></p>
</article>
<?php endforeach; ?>
</body>
</html>
Hàm esc() được dùng để escape dữ liệu, tránh tấn công XSS. Đây là thực hành bắt buộc khi hiển thị dữ liệu người dùng nhập.
6. Định tuyến (Routing) kết nối MVC
Route là cầu nối giữa URL và Controller. Trong CodeIgniter 4, bạn khai báo route tại app/Config/Routes.php:
<?php
$routes->get('blog', 'Blog::index');
$routes->get('blog/(:segment)', 'Blog::detail/$1');
Với cấu hình trên:
/blog→ gọi phương thứcindex()của controllerBlog./blog/ten-bai-viet→ gọi phương thứcdetail()với tham số là slug.
7. Luồng xử lý request hoàn chỉnh
Khi người dùng truy cập /blog/mo-hinh-mvc-trong-codeigniter-4, quy trình diễn ra như sau:
- Router phân tích URL, xác định controller
Blogvà phương thứcdetailvới tham sốmo-hinh-mvc-trong-codeigniter-4. - Controller
Blog::detail()được khởi tạo và gọi ModelBlogModel. - Model truy vấn cơ sở dữ liệu, trả về dữ liệu bài viết.
- Controller truyền dữ liệu sang View
blog/detail. - View render HTML và trả về response cho trình duyệt.
8. Lưu ý khi áp dụng MVC trong CodeIgniter 4
- Giữ Controller gọn nhẹ: Controller chỉ nên điều phối, không nhồi nhét logic nghiệp vụ phức tạp. Hãy đưa logic vào Model hoặc Service.
- Model không nên chứa logic hiển thị: Model chỉ xử lý dữ liệu, không định dạng HTML.
- View không gọi Model trực tiếp: View chỉ nhận dữ liệu từ Controller truyền sang.
- Sử dụng esc() khi hiển thị dữ liệu: Bảo mật là ưu tiên hàng đầu.
- Tận dụng Namespace: CodeIgniter 4 dùng namespace chuẩn PSR-4, giúp autoload và tổ chức code rõ ràng.
9. Kết luận
Mô hình MVC trong CodeIgniter 4 giúp tách biệt rõ ràng giữa xử lý dữ liệu, logic điều hướng và hiển thị giao diện. Khi nắm vững cách Router, Controller, Model và View phối hợp, bạn có thể xây dựng ứng dụng web có cấu trúc sạch, dễ mở rộng và bảo trì. Hãy bắt đầu với những controller và model đơn giản, sau đó mở rộng dần theo nhu cầu dự án.

