hongthanh.net

Mô Hình MVC Trong CodeIgniter 4

Mô Hình MVC Trong CodeIgniter 4
Mô hình MVC (Model - View - Controller) là nền tảng kiến trúc cốt lõi của CodeIgniter 4. Việc hiểu rõ cách MVC vận hành giúp bạn tổ chức code khoa học, dễ bảo trì và mở rộng dự án. Bài viết này sẽ phân tích chi tiết cách CodeIgniter 4 triển khai MVC, kèm ví dụ thực tế để bạn áp dụng ngay.

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 View blog/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ức index() của controller Blog.
  • /blog/ten-bai-viet → gọi phương thức detail() 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:

  1. Router phân tích URL, xác định controller Blog và phương thức detail với tham số mo-hinh-mvc-trong-codeigniter-4.
  2. Controller Blog::detail() được khởi tạo và gọi Model BlogModel.
  3. Model truy vấn cơ sở dữ liệu, trả về dữ liệu bài viết.
  4. Controller truyền dữ liệu sang View blog/detail.
  5. 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.

Chia sẻ