Tạo và chạy dự án CodeIgniter
CodeIgniter là gì?
CodeIgniter là một framework phát triển ứng dụng web PHP nhẹ, hiệu suất cao. Nó tuân theo mô hình thiết kế Model-View-Controller (MVC), giúp lập trình viên nhanh chóng xây dựng ứng dụng web giàu tính năng. CodeIgniter nổi bật với cấu trúc đơn giản, khả năng vận hành xuất sắc và rất dễ học, là lựa chọn hàng đầu của nhiều lập trình viên PHP.
Các tính năng chính và lợi thế của CodeIgniter
- Lõi nhẹ: Hệ thống CodeIgniter rất tinh gọn, chỉ chứa các thành phần cơ bản cần thiết giúp tải trang cực nhanh.
- Hiệu suất vượt trội: Thiết kế tối ưu để xử lý lượng truy cập lớn, mang lại hiệu năng ứng dụng xuất sắc.
- Dễ bắt đầu: Tài liệu rõ ràng, API trực quan, giảm thiểu độ phức tạp và giúp lập trình viên nhanh chóng thành thạo.
- Tính linh hoạt cao: Cho phép tự do chọn lựa, tích hợp thư viện bên thứ ba phù hợp nhu cầu dự án, dễ dàng mở rộng và tuỳ biến.
- Hỗ trợ cộng đồng mạnh mẽ: Sở hữu cộng đồng lớn, hoạt động năng nổ, cung cấp nhiều nguồn tài nguyên và hỗ trợ kỹ thuật.
CodeIgniter phù hợp cho mọi quy mô dự án, từ nhỏ đến lớn, giúp bạn xây dựng giải pháp web chất lượng một cách hiệu quả.
Thiết lập môi trường phát triển CodeIgniter với ServBay
ServBay là công cụ phát triển web địa phương cho macOS, tích hợp nhiều gói phần mềm (PHP, cơ sở dữ liệu: MySQL, PostgreSQL, MongoDB; bộ nhớ đệm: Redis, Memcached; máy chủ web: Caddy, Nginx, Apache) với giao diện quản lý tiện lợi. Với ServBay, bạn dễ dàng cài đặt và quản lý môi trường cần thiết để phát triển CodeIgniter.
Bài viết này sẽ hướng dẫn cách sử dụng môi trường PHP và tính năng Websites của ServBay để tạo, cấu hình và chạy dự án CodeIgniter, cũng như cách tích hợp các dịch vụ cơ sở dữ liệu và bộ nhớ đệm phổ biến.
Điều kiện tiên quyết
Trước khi bắt đầu, hãy đảm bảo bạn đã:
- Đã cài đặt và chạy thành công ServBay trên macOS.
- Đã kích hoạt phiên bản PHP mong muốn trong ServBay (ví dụ: PHP 8.3).
- Đã bật các gói cơ sở dữ liệu và bộ nhớ đệm mà bạn cần dùng trong ServBay (ví dụ: MySQL, PostgreSQL, Redis, Memcached).
Tạo dự án CodeIgniter
ServBay khuyến nghị lưu dự án website của bạn tại thư mục /Applications/ServBay/www
để tiện quản lý.
Cài đặt Composer
ServBay đã tích hợp sẵn Composer, thông thường bạn không cần cài thêm. Có thể sử dụng lệnh
composer
trực tiếp trong Terminal.Di chuyển vào thư mục gốc website
Mở Terminal, chuyển tới thư mục gốc dự án được khuyến nghị:
bashcd /Applications/ServBay/www
1Tạo dự án CodeIgniter
Dùng Composer để tạo dự án CodeIgniter 4 mới, ví dụ đặt tên là
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer sẽ tải về bộ khung dự án cùng các thư viện phụ thuộc vào thư mục
servbay-codeigniter-app
.Chuyển vào thư mục dự án
Truy cập thư mục CodeIgniter vừa tạo:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1
Cấu hình khởi tạo
Cấu hình kết nối cơ sở dữ liệu
File cấu hình kết nối cơ sở dữ liệu của CodeIgniter nằm tại app/Config/Database.php
. Trước khi sử dụng database, bạn cần chỉ định các thông tin kết nối tại đây.
Đầu tiên, nếu bạn cần dùng database, hãy đảm bảo đã tạo cơ sở dữ liệu tên là servbay_codeigniter_app
bằng công cụ quản lý database của ServBay (Adminer hoặc phpMyAdmin, truy cập từ giao diện ứng dụng ServBay).
Sau đó, mở file app/Config/Database.php
, tìm mảng $default
, điều chỉnh thông tin kết nối phù hợp loại cơ sở dữ liệu bạn sử dụng (MySQL hoặc PostgreSQL). Mặc định, tên đăng nhập và mật khẩu ServBay là root
và password
.
Ví dụ cấu hình MySQL:
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // ServBay database thường chạy ở 127.0.0.1
'username' => 'root', // Tên người dùng 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 bạn đã tạo
'DBDriver' => 'MySQLi', // Tùy loại DB, 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, // Cổng mặc định MySQL
];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Nếu sử dụng PostgreSQL, tham số DBDriver
phải là 'Postgre'
, port
thường là 5432
và một số cài đặt về charset có thể phải điều chỉnh cho phù hợp.
Cấu hình kết nối bộ nhớ đệm (Memcached/Redis)
Nếu sử dụng Memcached hoặc Redis làm bộ nhớ đệm, bạn cần cấu hình trong file app/Config/Cache.php
.
Chỉnh sửa file app/Config/Cache.php
, tìm đến phần cấu hình tương ứng. Memcached của ServBay mặc định ở cổng 11211
, Redis ở 6379
, thường không cần mật khẩu.
Ví dụ cấu hình Memcached:
public $memcached = [
'host' => '127.0.0.1', // Memcached ServBay thường chạy ở 127.0.0.1
'port' => 11211, // Cổng mặc định Memcached
'weight' => 1,
];
2
3
4
5
Ví dụ cấu hình Redis:
public string $handler = 'redis'; // Đặt handler mặc định là redis
public $default = [ // Cấu hình Redis thường trong mảng default
'host' => '127.0.0.1', // Redis ServBay thường chạy ở 127.0.0.1
'password' => null, // Redis ServBay thường không có mật khẩu
'port' => 6379, // Cổng mặc định Redis
'timeout' => 0,
'database' => 0,
];
2
3
4
5
6
7
8
9
Hãy đảm bảo tùy chỉnh đúng với các gói bộ nhớ đệm đã kích hoạt ở ServBay.
Cấu hình máy chủ Web (Thiết lập trang web trên ServBay)
Sử dụng tính năng Websites của ServBay để cấu hình máy chủ web, trỏ tới dự án CodeIgniter.
- Mở giao diện ứng dụng ServBay.
- Sang Tab Websites.
- Nhấn vào nút
+
dưới cùng bên trái để thêm website mới. - Điền thông tin website:
- Tên (Name): Đặt tên dễ nhận biết, ví dụ
My First CodeIgniter Dev Site
. - Tên miền (Domain): Nhập tên miền muốn dùng trên máy, ví dụ
servbay-codeigniter-test.local
. ServBay sẽ tự động ánh xạ tên miền.local
về localhost. - Loại website (Site Type): Chọn
PHP
. - Phiên bản PHP (PHP Version): Chọn phiên bản PHP bạn muốn sử dụng, vd
8.3
. - Thư mục gốc website (Document Root): Quan trọng! File vào của CodeIgniter (
index.php
) nằm trong thư mụcpublic
của dự án. Thư mục gốc nhất thiết phải đặt là:/Applications/ServBay/www/servbay-codeigniter-app/public
.
- Tên (Name): Đặt tên dễ nhận biết, ví dụ
- Nhấn Add để lưu cài đặt.
- Nếu ServBay yêu cầu xác nhận thay đổi, hãy bấm đồng ý.
Xem hướng dẫn chi tiết tại Thêm website đầu tiên.
Thêm mã ví dụ
Để kiểm tra dự án đã chạy cũng như test kết nối cơ sở dữ liệu/bộ nhớ đệm, hãy sửa controller mặc định Home
và thêm một số phương thức ví dụ.
Mở file app/Controllers/Home.php
, thay toàn bộ nội dung bằng đoạn sau:
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // Import exception liên quan database
use CodeIgniter\Cache\Exceptions\CacheException; // Import exception liên quan cache
class Home extends Controller
{
/**
* Phương thức trang chủ mặc định
*/
public function index(): string
{
// Trả về thông điệp chào mừng đơn giản
return '<h1>Hello ServBay and CodeIgniter!</h1><p>Your CodeIgniter project is running on ServBay.</p>';
}
/**
* Ví dụ sử dụng Memcached
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// Thử lưu dữ liệu vào cache
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // Lưu cache 60 giây
if (!$success) {
return 'Error: Failed to save data to Memcached. Check Memcached service and configuration.';
}
// Thử đọc dữ liệu từ cache
$value = $cache->get('servbay_memcached_key');
if ($value === null) {
return 'Error: Failed to get data from Memcached. Cache might have expired or service is down.';
}
return 'Memcached Test Success: ' . $value;
} catch (CacheException $e) {
// Bắt lỗi liên quan cache
return 'Cache Error: ' . $e->getMessage() . '. Ensure Memcached service is running and configured correctly.';
} catch (\Exception $e) {
// Bắt các lỗi khác
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Ví dụ sử dụng Redis
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// Thử lưu dữ liệu vào cache
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // Lưu cache 60 giây
if (!$success) {
return 'Error: Failed to save data to Redis. Check Redis service and configuration.';
}
// Thử đọc dữ liệu từ cache
$value = $cache->get('servbay_redis_key');
if ($value === null) {
return 'Error: Failed to get data from Redis. Cache might have expired or service is down.';
}
return 'Redis Test Success: ' . $value;
} catch (CacheException $e) {
// Bắt lỗi liên quan cache
return 'Cache Error: ' . $e->getMessage() . '. Ensure Redis service is running and configured correctly.';
} catch (\Exception $e) {
// Bắt các lỗi khác
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Thêm người dùng vào cơ sở dữ liệu (MySQL/PostgreSQL)
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// Kiểm tra bảng 'users' đã tồn tại chưa
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// Thêm dữ liệu
$data = [
'name' => 'ServBay Demo User',
'email' => 'user_' . time() . '@servbay.demo', // Đảm bảo email là duy nhất
];
$db->table('users')->insert($data);
// Kiểm tra chèn thành công (tùy chọn)
// if ($db->affectedRows() > 0) {
return 'User added successfully: ' . $data['email'];
// } else {
// return 'Error: Failed to add user.';
// }
} catch (DatabaseException $e) {
// Bắt lỗi database
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// Bắt các lỗi khác
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* Liệt kê người dùng từ cơ sở dữ liệu (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// Kiểm tra bảng 'users'
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// Truy vấn tất cả người dùng
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'No users found in the database.';
}
// Trả về danh sách người dùng dạng JSON
return json_encode($users);
} catch (DatabaseException $e) {
// Bắt lỗi database
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// Bắt các lỗi khác
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
}
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 vừa cập nhật sẽ cung cấp xuất thông tin rõ ràng cùng xử lý lỗi căn bản nhằm chẩn đoán sự cố dễ dàng.
Cấu hình routes
Để truy cập các phương thức ví dụ vừa thêm trong controller Home
, hãy bổ sung rule routing vào file cấu hình CodeIgniter.
Mở app/Config/Routes.php
, tìm phần định nghĩa $routes
, thêm các rule sau:
// ... 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 ...
2
3
4
5
6
7
8
9
10
11
12
13
Đảm bảo thêm vào các route này, không xóa mất nội dung routing hiện tại.
Truy cập website
Dự án CodeIgniter của bạn giờ đã được cấu hình hoàn chỉnh trên ServBay. Mở trình duyệt và nhập tên miền đã cài đặt lúc trước để bắt đầu kiểm tra:
Truy cập trang chủ:
https://servbay-codeigniter-test.local
Nếu thấy dòng chữ
Hello ServBay and CodeIgniter!
là website đã chạy thành công trên ServBay.Kiểm tra ví dụ Memcached:
https://servbay-codeigniter-test.local/memcached
Nếu dịch vụ Memcached hoạt động, sẽ thấy kết quả dạngMemcached Test Success: Hello Memcached from CodeIgniter!
.Kiểm tra ví dụ Redis:
https://servbay-codeigniter-test.local/redis
Nếu Redis hoạt động, sẽ xuất hiện dòng tương tựRedis Test Success: Hello Redis from CodeIgniter!
.
Ví dụ thao tác cơ sở dữ liệu (MySQL/PostgreSQL)
Trước khi sử dụng các route ví dụ với database, bạn cần chạy lệnh migrate để tạo bảng users
.
Tạo cấu trúc database (Chạy migration)
Mở Terminal và vào thư mục dự án CodeIgniter:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Tạo file migration: Sử dụng CLI của CodeIgniter để sinh migration tạo bảng
users
:bashphp spark make:migration create_users_table
1File PHP migration mới sẽ nằm trong thư mục
app/Database/Migrations
.Sửa file migration: Mở file migration mới tạo (vd
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
), cập nhật hàmup()
để định nghĩa cấu trúc bảng. Lưu ý, MySQL và PostgreSQL khác nhau về cú pháp giá trị mặc định của timestamp (CURRENT_TIMESTAMP
vsNOW()
), bạn có thể dùngRawSql
của CodeIgniter để xử lý. Ví dụ: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, // email là duy nhất ], 'created_at' => [ 'type' => 'TIMESTAMP', // Chọn biểu thức mặc định phù hợp DB nền tảng // MySQL: 'default' => new RawSql('CURRENT_TIMESTAMP'), // PostgreSQL: 'default' => new RawSql('NOW()'), 'default' => new RawSql($this->db->getPlatform() === 'MySQLi' ? 'CURRENT_TIMESTAMP' : 'NOW()'), // Tự động chọn ], '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()'), // Tự động chọn ], ]); $this->forge->addKey('id', true); // Đặt id làm khóa chính $this->forge->createTable('users'); // Tạo bảng users } public function down() { // Khi rollback migration: 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 ý: Đoạn code dùng logic đơn giản để chọn cú pháp timestamp phù hợp DB đang sử dụng. Thực tế, bạn có thể tách riêng migration cho từng loại DB để tăng tính ổn định.
Chạy migration: Trong terminal, chạy lệnh để tạo bảng
users
:bashphp spark migrate
1Nếu thành công sẽ có thông báo trên terminal. Bạn cũng có thể dùng Adminer của ServBay để kiểm tra bảng này đã xuất hiện trong database
servbay_codeigniter_app
.
Truy cập các route ví dụ database
Đảm bảo bạn đã cấu hình đúng thông tin kết nối trong app/Config/Database.php
và hoàn tất việc chạy migration.
Thêm người dùng: Truy cập
https://servbay-codeigniter-test.local/add-user
Mỗi lần truy cập, một tài khoản người dùng mới sẽ được thêm vào bảng
users
. Trình duyệt sẽ hiện thông báo đại loại:User added successfully: [email protected]
.Liệt kê người dùng: Truy cập
https://servbay-codeigniter-test.local/list-users
Link này trả về toàn bộ bản ghi trong bảng
users
dưới dạng JSON.
Tổng kết
Bằng cách đi theo từng bước ở trên, bạn đã thiết lập được dự án CodeIgniter chạy trên ServBay của macOS, biết cách tạo project bằng Composer, cấu hình website ServBay trỏ đúng thư mục, tùy chỉnh kết nối database và bộ nhớ đệm của CodeIgniter, dùng code đơn giản kiểm tra tích hợp database/bộ nhớ đệm. ServBay giúp giảm thiểu thời gian thiết lập môi trường địa phương, để bạn tập trung phát triển ứng dụng CodeIgniter hiệu quả hơn.