Tạo và chạy dự án CodeIgniter
CodeIgniter là gì?
CodeIgniter là một framework PHP nhẹ, hiệu suất cao dành cho phát triển ứng dụng web. Nó tuân theo mô hình Model-View-Controller (MVC), giúp lập trình viên xây dựng nhanh chóng website mạnh mẽ và giàu tính năng. Với cấu trúc đơn giản, tốc độ xử lý ấn tượng và dễ học, CodeIgniter được nhiều lập trình viên PHP lựa chọn.
Tính năng nổi bật và ưu điểm của CodeIgniter
- Core nhỏ gọn: Phần lõi của CodeIgniter chỉ bao gồm những thành phần thiết yếu giúp framework tải cực nhanh.
- Hiệu suất vượt trội: Thiết kế tối ưu cho hiệu năng, xử lý tốt lượng lớn request đồng thời, đáp ứng tiêu chuẩn ứng dụng lớn.
- Dễ bắt đầu: Tài liệu chi tiết, API trực quan, giúp lập trình viên nhanh chóng làm quen từ cơ bản đến chuyên sâu.
- Linh hoạt cao: Tích hợp dễ dàng các thư viện bên ngoài, mở rộng tuỳ ý theo nhu cầu dự án.
- Cộng đồng phát triển mạnh: Mạng lưới lập trình viên đông đảo, hỗ trợ và chia sẻ nguồn tài nguyên đa dạng.
CodeIgniter thích hợp từ dự án nhỏ tới ứng dụng doanh nghiệp lớn, giúp lập trình viên nâng cao năng suất và chất lượng sản phẩm.
Thiết lập môi trường CodeIgniter với ServBay
ServBay là công cụ môi trường phát triển web dành cho macOS và Windows, tích hợp sẵn các dịch vụ như PHP, database (MySQL, PostgreSQL, MongoDB), cache (Redis, Memcached), web server (Caddy, Nginx, Apache) cùng giao diện quản trị thuận tiện. Nhờ ServBay, bạn dễ dàng dựng môi trường phục vụ CodeIgniter.
Bài viết này hướng dẫn cách sử dụng PHP Environment, chức năng Websites của ServBay để tạo, cấu hình và chạy dự án CodeIgniter, đồng thời kết nối đa dạng database và cache.
Yêu cầu ban đầu
Trước khi bắt đầu, hãy đảm bảo:
- Đã cài đặt và chạy ServBay trên macOS hoặc Windows.
- Đã enable phiên bản PHP mong muốn trong ServBay (Ví dụ: PHP 8.3).
- Đã bật database và cache bạn sẽ sử dụng trong ServBay (như MySQL, PostgreSQL, Redis, Memcached).
Tạo dự án CodeIgniter
ServBay khuyến nghị lưu toàn bộ website/dự án tại các thư mục sau để dễ quản lý:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
Cài đặt Composer
ServBay đã tích hợp Composer sẵn, bạn không cần cài đặt thêm. Có thể sử dụng trực tiếp lệnh
composer
trên Terminal.Truy cập thư mục gốc website
Mở Terminal, chuyển tới thư mục website được ServBay khuyến nghị:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1Tạo dự án CodeIgniter
Dùng Composer để khởi tạo project CodeIgniter 4 mới, ví dụ tên thư mục là
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer sẽ tải các tập tin khởi động và dependency của CodeIgniter về thư mục dự án.
Chuyển vào thư mục dự án
Tiến vào thư mục CodeIgniter vừa tạo:
macOS:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Windows:
cmdcd C:\ServBay\www\servbay-codeigniter-app
1
Khởi tạo cấu hình
Cài đặt kết nối Database
Cấu hình database của CodeIgniter nằm trong file app/Config/Database.php
. Trước khi sử dụng database, cần cập nhật thông tin kết nối tại file này.
Nếu dùng database, hãy tạo trước database tên servbay_codeigniter_app
bằng admin tool (như Adminer hoặc phpMyAdmin trên giao diện ServBay).
Sau đó, chỉnh $default
array trong app/Config/Database.php
, điền thông tin phù hợp loại database bạn đã enable trên ServBay (MySQL hoặc PostgreSQL). Username/password mặc định của ServBay thường là root
/ password
.
Ví dụ cấu hình MySQL:
php
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // Database của ServBay thường lắng nghe trên 127.0.0.1
'username' => 'root', // User mặc định của ServBay
'password' => 'password', // Mật khẩu mặc định của ServBay
'database' => 'servbay_codeigniter_app', // Tên database vừa tạo
'DBDriver' => 'MySQLi', // Tùy loại, MySQL dùng MySQLi hoặc Pdo
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // Port mặc định của MySQL
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Nếu dùng PostgreSQL thì DBDriver
đổi thành 'Postgre'
, port
thường là 5432
, cần chỉnh lại các thiết lập về charset nếu cần.
Cài đặt kết nối cache (Memcached/Redis)
Khi dùng Memcached hoặc Redis làm cache, hãy cấu hình tại file app/Config/Cache.php
.
Chỉnh sửa file app/Config/Cache.php
, điền đúng thông tin ở phần tương ứng. Port mặc định của ServBay là 11211
(Memcached), 6379
(Redis), thường không cần mật khẩu.
Ví dụ cấu hình Memcached:
php
public $memcached = [
'host' => '127.0.0.1', // Memcached của ServBay thường lắng nghe trên 127.0.0.1
'port' => 11211, // Port mặc định Memcached
'weight' => 1,
];
1
2
3
4
5
2
3
4
5
Ví dụ cấu hình Redis:
php
public string $handler = 'redis'; // Đặt handler mặc định là redis
public $default = [ // Redis thường cấu hình trong default array
'host' => '127.0.0.1', // Redis của ServBay thường lắng nghe trên 127.0.0.1
'password' => null, // Redis mặc định không có mật khẩu
'port' => 6379, // Port mặc định Redis
'timeout' => 0,
'database' => 0,
];
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Nhớ kiểm tra loại cache đang kích hoạt trên ServBay để cấu hình đúng loại.
Cấu hình Web Server (thiết lập Website trên ServBay)
Dùng chức năng Websites của ServBay để cấu hình web server cho project CodeIgniter:
- Mở giao diện ứng dụng ServBay.
- Điều hướng tới tab Websites.
- Nhấn nút
+
ở góc trái để thêm website mới. - Điền các thông tin sau:
- Name (Tên): Đặt tên dễ nhận biết, ví dụ
My First CodeIgniter Dev Site
. - Domain (Tên miền): Điền domain bạn muốn dùng, ví dụ
servbay-codeigniter-test.local
. ServBay tự động trỏ domain.local
về máy bạn. - Site Type (Loại site): Chọn
PHP
. - PHP Version (Phiên bản PHP): Chọn PHP phù hợp, ví dụ
8.3
. - Document Root (Thư mục gốc): Quan trọng. File vào của CodeIgniter (
index.php
) nằm trong folderpublic
ở gốc dự án. Vì vậy, thư mục gốc website phải trỏ vào thư mụcpublic
bên trong dự án:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- Name (Tên): Đặt tên dễ nhận biết, ví dụ
- Nhấn Add để lưu cấu hình.
- Nếu ServBay hỏi xác nhận, nhấn đồng ý để áp dụng thay đổi.
Xem thêm hướng dẫn chi tiết ở Thêm website đầu tiên.
Thêm mã ví dụ
Để kiểm tra hoạt động của project và kết nối database, cache, hãy sửa controller mặc định Home
của CodeIgniter, bổ sung một số method mẫu.
Chỉnh sửa file app/Controllers/Home.php
, thay toàn bộ nội dung bằng đoạn sau:
php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // Import class ngoại lệ database
use CodeIgniter\Cache\Exceptions\CacheException; // Import class ngoại lệ cache
class Home extends Controller
{
/**
* Hàm trang chủ mặc định
*/
public function index(): string
{
// Hiển thị thông điệp chào mừng
return '<h1>Hello ServBay and CodeIgniter!</h1><p>Dự án CodeIgniter của bạn đang chạy trên ServBay.</p>';
}
/**
* Hàm ví dụ Memcached
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// Thử ghi cache
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // Cache 60 giây
if (!$success) {
return 'Lỗi: Không thể lưu dữ liệu vào Memcached. Kiểm tra dịch vụ và cấu hình Memcached.';
}
// Thử đọc cache
$value = $cache->get('servbay_memcached_key');
if ($value === null) {
return 'Lỗi: Không thể đọc dữ liệu từ Memcached. Cache có thể đã hết hạn hoặc dịch vụ bị lỗi.';
}
return 'Test Memcached thành công: ' . $value;
} catch (CacheException $e) {
// Bắt ngoại lệ liên quan cache
return 'Lỗi Cache: ' . $e->getMessage() . '. Đảm bảo dịch vụ Memcached đang chạy và cấu hình đúng.';
} catch (\Exception $e) {
// Bắt ngoại lệ khác (không ngờ tới)
return 'Có lỗi ngoài dự kiến: ' . $e->getMessage();
}
}
/**
* Hàm ví dụ Redis
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// Thử ghi cache
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // Cache 60 giây
if (!$success) {
return 'Lỗi: Không thể lưu dữ liệu vào Redis. Kiểm tra dịch vụ và cấu hình Redis.';
}
// Thử đọc cache
$value = $cache->get('servbay_redis_key');
if ($value === null) {
return 'Lỗi: Không thể đọc dữ liệu từ Redis. Cache có thể đã hết hạn hoặc dịch vụ bị lỗi.';
}
return 'Test Redis thành công: ' . $value;
} catch (CacheException $e) {
// Bắt ngoại lệ liên quan cache
return 'Lỗi Cache: ' . $e->getMessage() . '. Đảm bảo dịch vụ Redis đang chạy và cấu hình đúng.';
} catch (\Exception $e) {
// Bắt ngoại lệ khác (không ngờ tới)
return 'Có lỗi ngoài dự kiến: ' . $e->getMessage();
}
}
/**
* Thêm user vào database (MySQL/PostgreSQL)
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// Kiểm tra bảng 'users' tồn tại (đề phòng)
if (!$db->tableExists('users')) {
return 'Lỗi: Bảng "users" chưa tồn tại. Hãy chạy lệnh migrate để tạo bảng.';
}
// Thêm dữ liệu
$data = [
'name' => 'ServBay Demo User',
'email' => 'user_' . time() . '@servbay.demo', // Dùng time() để tạo email duy nhất
];
$db->table('users')->insert($data);
// Kiểm tra thành công (thường insert() trả về true)
// if ($db->affectedRows() > 0) {
return 'Thêm user thành công: ' . $data['email'];
// } else {
// return 'Lỗi: Không thêm được user.';
// }
} catch (DatabaseException $e) {
// Bắt ngoại lệ liên quan database
return 'Lỗi Database: ' . $e->getMessage() . '. Kiểm tra kết nối và cấu trúc bảng.';
} catch (\Exception $e) {
// Bắt ngoại lệ khác
return 'Có lỗi ngoài dự kiến: ' . $e->getMessage();
}
}
/**
* Lấy danh sách user từ database (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// Kiểm tra bảng 'users' tồn tại
if (!$db->tableExists('users')) {
return 'Lỗi: Bảng "users" chưa tồn tại. Hãy chạy lệnh migrate để tạo bảng.';
}
// Lấy toàn bộ user
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'Không tìm thấy user trong database.';
}
// Trả về danh sách user dạng JSON
return json_encode($users);
} catch (DatabaseException $e) {
// Bắt ngoại lệ liên quan database
return 'Lỗi Database: ' . $e->getMessage() . '. Kiểm tra kết nối và cấu trúc bảng.';
} catch (\Exception $e) {
// Bắt ngoại lệ khác
return 'Có lỗi ngoài dự kiến: ' . $e->getMessage();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
Controller này đã bổ sung thông báo dễ hiểu và code xử lý lỗi cơ bản giúp kiểm tra kết nối database, cache.
Cấu hình route
Để truy cập các hàm ví dụ vừa thêm ở controller Home
, bạn cần bổ sung route cho chúng trong file cấu hình route của CodeIgniter.
Chỉnh sửa file app/Config/Routes.php
, tìm phần định nghĩa $routes
và thêm các rule sau:
php
// ... các rule khác ...
// Route ví dụ Memcached
$routes->get('/memcached', 'Home::memcached');
// Route ví dụ Redis
$routes->get('/redis', 'Home::redis');
// Route ví dụ database
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... các rule khác ...
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
Nhớ thêm vào trong array $routes
, tránh ghi đè các route sẵn có.
Truy cập website
Giờ bạn đã cấu hình và khởi chạy thành công dự án CodeIgniter trên ServBay. Mở trình duyệt web, dùng domain đã thiết lập để truy cập:
Trang chủ:
https://servbay-codeigniter-test.local
Nếu OK, bạn sẽ thấy dòng hiển thịHello ServBay and CodeIgniter!
, xác nhận dự án chạy qua Web Server của ServBay.Ví dụ Memcached:
https://servbay-codeigniter-test.local/memcached
Nếu Memcached hoạt động, sẽ hiệnTest Memcached thành công: Hello Memcached from CodeIgniter!
.Ví dụ Redis:
https://servbay-codeigniter-test.local/redis
Nếu Redis hoạt động, sẽ hiệnTest Redis thành công: Hello Redis from CodeIgniter!
.
Thao tác với database (MySQL/PostgreSQL)
Trước khi kiểm thử database, bạn cần chạy lệnh migrate để tạo bảng users
.
Tạo cấu trúc database (chạy migrate)
Mở terminal, di chuyển tới thư mục dự án CodeIgniter:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Tạo file migrate: Dùng tool CLI của CodeIgniter tạo file migrate định nghĩa bảng
users
:bashphp spark make:migration create_users_table
1Một file PHP mới sẽ xuất hiện trong thư mục
app/Database/Migrations
.Chỉnh sửa file migrate: Mở file migrate vừa tạo (tên dạng
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
), bổ sung code vào methodup()
như sau. Lưu ý, MySQL và PostgreSQL có cú pháp default timestamp khác nhau (CURRENT_TIMESTAMP
vàNOW()
), dùng classRawSql
để xử lý:php<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // Đảm bảo đã import RawSql class CreateUsersTable extends Migration { public function up() { $this->forge->addField([ 'id' => [ 'type' => 'INT', 'constraint' => 5, 'unsigned' => true, 'auto_increment' => true, ], 'name' => [ 'type' => 'VARCHAR', 'constraint' => '100', ], 'email' => [ 'type' => 'VARCHAR', 'constraint' => '100', 'unique' => true, // Đặt email là duy nhất ], 'created_at' => [ 'type' => 'TIMESTAMP', // Tùy database platform mà dùng default khác // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP' : 'NOW()'), ], 'updated_at' => [ 'type' => 'TIMESTAMP', // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP' : 'NOW()'), ], ]); $this->forge->addKey('id', true); // Đặt id làm primary key $this->forge->createTable('users'); // Tạo bảng users } public function down() { // Rollback migrate, xóa bảng users $this->forge->dropTable('users'); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51Lưu ý: Ví dụ trên dùng logic đơn giản để chọn cú pháp timestamp theo loại database. Với dự án thực tế có thể cần script migrate phức tạp hoặc tách migrate cho từng loại database.
Chạy migrate: Trong terminal, thực hiện lệnh để tạo bảng:
bashphp spark migrate
1Nếu thành công, sẽ hiện thông báo success. Bạn cũng có thể mở tool database của ServBay để kiểm tra database
servbay_codeigniter_app
đã có bảngusers
.
Truy cập ví dụ database
Hãy chắc chắn rằng bạn đã cấu hình thông tin kết nối database hợp lý ở app/Config/Database.php
và migrated đủ bảng.
Thêm user vào database: Tới
https://servbay-codeigniter-test.local/add-user
Mỗi lần truy cập sẽ thêm một user mới vào bảng, hiện ra dòngThêm user thành công: user_XXXXXXXXXX@servbay.demo
.Xem danh sách user database: Tới
https://servbay-codeigniter-test.local/list-users
Trang này sẽ trả về dữ liệu các user dưới dạng JSON.
Tổng kết
Qua các bước trên, bạn đã thành công tạo, cấu hình và chạy dự án CodeIgniter trên ServBay ở macOS hoặc Windows. Bạn đã học cách khởi tạo project với Composer, cấu hình Website của ServBay đúng thư mục, cài đặt kết nối database và cache cho CodeIgniter, và xác minh trực tiếp qua controller và route mẫu. ServBay hỗ trợ việc xây dựng môi trường nhanh chóng, giúp bạn tập trung phát triển ứng dụng CodeIgniter hiệu quả nhất.