CodeIgniter là một framework PHP phổ biến được sử dụng để phát triển ứng dụng web. Một trong những điểm mạnh của CodeIgniter là cấu trúc thư mục rõ ràng và dễ hiểu, giúp quản lý mã nguồn và phát triển ứng dụng hiệu quả. Trong bài viết này, chúng ta sẽ đi sâu vào cấu trúc thư mục của CodeIgniter, từ cơ bản đến nâng cao, với các ví dụ minh họa chi tiết.

1. Tổng Quan về Cấu Trúc Thư Mục trong CodeIgniter

CodeIgniter sử dụng một cấu trúc thư mục chuẩn giúp phân loại và tổ chức mã nguồn một cách hợp lý. Dưới đây là mô tả cơ bản về các thư mục chính trong CodeIgniter:

1.1. Thư Mục application

Thư mục application chứa tất cả các thành phần của ứng dụng, bao gồm:

  • config: Chứa các tệp cấu hình của ứng dụng. Ví dụ như cấu hình cơ sở dữ liệu (database.php), cấu hình email (email.php), và cấu hình chung (config.php).
  • controllers: Chứa các lớp điều khiển (controller) của ứng dụng. Controllers chịu trách nhiệm xử lý yêu cầu từ người dùng và gọi các mô hình để lấy dữ liệu.
  • models: Chứa các lớp mô hình (model). Models thường đại diện cho dữ liệu và logic nghiệp vụ của ứng dụng.
  • views: Chứa các tệp giao diện (view). Views là phần hiển thị dữ liệu cho người dùng và thường là các tệp HTML.
  • libraries: Chứa các thư viện tùy chỉnh của ứng dụng. Đây là nơi bạn có thể đặt các lớp tùy chỉnh hoặc các thư viện bên ngoài.
  • helpers: Chứa các hàm trợ giúp (helper functions) mà bạn có thể sử dụng trong các controller và views.
  • language: Chứa các tệp ngôn ngữ để hỗ trợ đa ngôn ngữ trong ứng dụng.
  • hooks: Chứa các hook, cho phép bạn can thiệp vào luồng xử lý của CodeIgniter mà không cần thay đổi mã nguồn chính.
  • third_party: Chứa các thư viện bên ngoài không thuộc về CodeIgniter nhưng cần thiết cho ứng dụng của bạn.

1.2. Thư Mục system

Thư mục system chứa mã nguồn chính của CodeIgniter và không nên bị thay đổi. Các thư mục con trong system bao gồm:

  • core: Chứa các lớp lõi của CodeIgniter, chẳng hạn như lớp Controller và Model.
  • libraries: Chứa các thư viện hệ thống mà CodeIgniter cung cấp sẵn.
  • helpers: Chứa các hàm trợ giúp sẵn có của CodeIgniter.
  • database: Chứa các lớp liên quan đến cơ sở dữ liệu của CodeIgniter.
  • config: Chứa các tệp cấu hình hệ thống của CodeIgniter.

1.3. Thư Mục public

Thư mục public chứa các tệp tài nguyên công khai, như:

  • index.php: Tệp điểm vào của ứng dụng. Đây là tệp được gọi đầu tiên khi ứng dụng được truy cập.
  • assets: Chứa các tệp tài nguyên như CSS, JavaScript, và hình ảnh.

2. Ví Dụ Minh Họa về Cấu Trúc Thư Mục

2.1. Ví Dụ về Thư Mục controllers

Giả sử bạn có một ứng dụng quản lý bài viết. Bạn có thể tạo một controller Posts.php trong thư mục controllers:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Posts extends CI_Controller {

    public function __construct() {
        parent::__construct();
        $this->load->model('Post_model');
    }

    public function index() {
        $data['posts'] = $this->Post_model->get_posts();
        $this->load->view('posts/index', $data);
    }
}
?>

2.2. Ví Dụ về Thư Mục models

Trong thư mục models, bạn có thể có một lớp mô hình Post_model.php như sau:

<?php
class Post_model extends CI_Model {

    public function __construct() {
        $this->load->database();
    }

    public function get_posts() {
        $query = $this->db->get('posts');
        return $query->result_array();
    }
}
?>

2.3. Ví Dụ về Thư Mục views

Thư mục views có thể chứa một tệp index.php trong thư mục posts:

<!DOCTYPE html>
<html>
<head>
    <title>Posts</title>
</head>
<body>
    <h1>Posts</h1>
    <?php foreach ($posts as $post): ?>
        <h2><?php echo $post['title']; ?></h2>
        <p><?php echo $post['content']; ?></p>
    <?php endforeach; ?>
</body>
</html>

3. Cấu Trúc Thư Mục Nâng Cao và Tùy Chỉnh

3.1. Thư Mục libraries

Bạn có thể tạo một thư viện tùy chỉnh My_library.php trong thư mục libraries:

<?php
class My_library {

    public function __construct() {
        // Constructor code here
    }

    public function my_function() {
        // Function code here
    }
}
?>

Để sử dụng thư viện này trong controller:

$this->load->library('my_library');
$this->my_library->my_function();

3.2. Thư Mục hooks

Giả sử bạn muốn tạo một hook để log các truy vấn cơ sở dữ liệu. Bạn có thể thêm cấu hình trong application/config/hooks.php:

$hook['post_controller'][] = array(
    'class'    => 'My_hook',
    'function' => 'log_queries',
    'filename' => 'My_hook.php',
    'filepath' => 'hooks'
);

Tạo tệp My_hook.php trong thư mục hooks:

<?php
class My_hook {

    public function log_queries() {
        // Code to log queries
    }
}
?>

4. Kết Luận

Cấu trúc thư mục của CodeIgniter cung cấp một tổ chức rõ ràng và hiệu quả cho mã nguồn của bạn. Bằng cách phân chia các thành phần của ứng dụng vào các thư mục riêng biệt như application, system, và public, bạn có thể dễ dàng quản lý và mở rộng ứng dụng của mình. Các ví dụ minh họa từ cơ bản đến nâng cao giúp bạn hiểu rõ hơn cách làm việc với các thư mục và thành phần trong CodeIgniter.