สร้างและรันโปรเจกต์ CodeIgniter
CodeIgniter คืออะไร?
CodeIgniter คือเฟรมเวิร์กสำหรับพัฒนาเว็บแอปพลิเคชัน PHP ที่มีน้ำหนักเบาและประสิทธิภาพสูง ออกแบบตาม Model-View-Controller (MVC) ขึ้นมาเพื่อช่วยให้นักพัฒนาสามารถสร้างเว็บไซต์ที่มีฟังก์ชันครบครันได้อย่างรวดเร็ว ด้วยโครงสร้างที่เรียบง่าย ประสิทธิภาพดี และเอกสารประกอบเข้าใจง่าย CodeIgniter จึงเป็นหนึ่งในเฟรมเวิร์กยอดนิยมของนักพัฒนา PHP
จุดเด่นและข้อดีหลักของ CodeIgniter
- แกนระบบเบา (Lightweight core): ใช้เฉพาะองค์ประกอบหลักที่จำเป็น ทำงานรวดเร็วไม่โหลดเครื่อง
- ประสิทธิภาพยอดเยี่ยม: รองรับการประมวลผลที่มีการเข้าใช้งานจำนวนมาก ให้ประสบการณ์การใช้งานแอปที่ดี
- ง่ายต่อการเริ่มต้น: เอกสารชัดเจน API เข้าใจง่าย ลดเวลาในการศึกษา
- ยืดหยุ่นสูง: เลือกเสริมหรือเชื่อมต่อไลบรารีของ third party ได้อย่างอิสระ เพิ่มความคล่องตัวในการปรับแต่ง
- ชุมชนสนับสนุนขนาดใหญ่: มีนักพัฒนาและทรัพยากรช่วยเหลือมากมาย
CodeIgniter เหมาะกับทั้งโปรเจกต์ขนาดเล็กจนถึงระบบองค์กรขนาดใหญ่ ช่วยให้การพัฒนาเว็บมีคุณภาพและรวดเร็วขึ้น
สร้างสภาพแวดล้อมพัฒนา CodeIgniter ด้วย ServBay
ServBay คือเครื่องมือสำหรับสร้าง local web development environment บน macOS โดยรวมโปรแกรมสำคัญ เช่น PHP, ฐานข้อมูล (MySQL, PostgreSQL, MongoDB), ระบบแคช (Redis, Memcached), เว็บเซิร์ฟเวอร์ (Caddy, Nginx, Apache) และมีอินเทอร์เฟซจัดการที่ใช้งานง่าย เพียงไม่กี่ขั้นตอน คุณก็สามารถติดตั้งและจัดการสภาพแวดล้อมสำหรับโครงการ CodeIgniter ได้ทันที
บทความนี้จะสอนการใช้ PHP environment และฟีเจอร์เว็บไซต์ของ ServBay เพื่อสร้าง ตั้งค่า และรันโปรเจกต์ CodeIgniter รวมถึงตัวอย่างการเชื่อมต่อฐานข้อมูลและบริการแคชหลากหลาย
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น โปรดตรวจสอบให้แน่ใจว่าคุณได้เตรียมสิ่งต่อไปนี้แล้ว:
- ติดตั้งและเปิดใช้งาน ServBay บน macOS สำเร็จแล้ว
- เปิดใช้งานเวอร์ชัน PHP ที่ต้องการใน ServBay (เช่น PHP 8.3)
- เปิดใช้งานแพกเกจฐานข้อมูลหรือแคชที่ต้องการใน ServBay (เช่น MySQL, PostgreSQL, Redis, Memcached)
สร้างโปรเจกต์ CodeIgniter
แนะนำให้เก็บไฟล์โปรเจกต์เว็บไซต์ไว้ที่ /Applications/ServBay/www
เพื่อง่ายต่อการจัดการของ ServBay
ติดตั้ง Composer
ServBay จะติดตั้ง Composer ไว้แล้วตั้งแต่แรกเริ่ม (ดูรายละเอียด) คุณสามารถใช้คำสั่ง
composer
กับ Terminal ได้เลยโดยไม่ต้องติดตั้งเพิ่มเข้าไปยังโฟลเดอร์ root ของเว็บไซต์
เปิด Terminal แล้วเปลี่ยน path ไปยังไดเรกทอรีเว็บไซต์ที่แนะนำ
bashcd /Applications/ServBay/www
1สร้างโปรเจกต์ CodeIgniter
ใช้ Composer เพื่อสร้าง CodeIgniter 4 ใหม่ ตั้งชื่อโฟลเดอร์ว่า
servbay-codeigniter-app
bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer จะดาวน์โหลด CodeIgniter และ dependencies ทั้งหมดไว้ใน
servbay-codeigniter-app
เข้าไปในโฟลเดอร์โปรเจกต์
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1
การตั้งค่าเริ่มต้น
ตั้งค่าการเชื่อมต่อฐานข้อมูล
แฟ้มตั้งค่าฐานข้อมูลของ CodeIgniter อยู่ที่ app/Config/Database.php
ก่อนใช้งานฐานข้อมูล ให้ไปกำหนดค่าการเชื่อมต่อที่นี่
หากจะใช้ฐานข้อมูล ให้สร้างฐานข้อมูลชื่อ servbay_codeigniter_app
ผ่านเครื่องมือจัดการฐานข้อมูล (Adminer หรือ phpMyAdmin) ใน ServBay ก่อน
จากนั้น แก้ไขไฟล์ app/Config/Database.php
โดยค้นหาพารามิเตอร์ $default
แล้วกรอกข้อมูลเชื่อมต่อให้ตรงกับฐานข้อมูลที่เปิดใช้งาน (MySQL หรือ PostgreSQL) โดยปกติ ServBay จะใช้ user root
กับ password password
ตัวอย่างการตั้งค่าสำหรับ MySQL:
php
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // ServBay ฐานข้อมูลอยู่ที่ 127.0.0.1
'username' => 'root', // ชื่อผู้ใช้เริ่มต้นของ ServBay
'password' => 'password', // รหัสผ่านเริ่มต้นของ ServBay
'database' => 'servbay_codeigniter_app', // ชื่อฐานข้อมูลที่สร้างไว้
'DBDriver' => 'MySQLi', // เลือกตามชนิดฐานข้อมูล MySQL ใช้ MySQLi หรือ Pdo
'DBPrefix' => '',
'pConnect' => false,
'DBDebug' => (ENVIRONMENT !== 'production'),
'charset' => 'utf8mb4',
'DBCollat' => 'utf8mb4_general_ci',
'swapPre' => '',
'encrypt' => false,
'compress' => false,
'strictOn' => false,
'failover' => [],
'port' => 3306, // พอร์ตเริ่มต้น 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
หากใช้ PostgreSQL ตั้งค่า 'DBDriver' => 'Postgre'
และ port
เป็น 5432
อาจจำเป็นต้องปรับ 'charset'
และค่าต่างๆ ตามความเหมาะสม
ตั้งค่าการเชื่อมต่อแคช (Memcached/Redis)
หากต้องการใช้งาน Memcached หรือ Redis เป็นระบบแคช ให้ปรับที่ไฟล์ app/Config/Cache.php
แก้ไขไฟล์ app/Config/Cache.php
ค้นหา segment สำหรับ Memcached หรือ Redis โดย ServBay ตั้งค่าพอร์ตของ Memcached ไว้ที่ 11211
และ Redis ที่ 6379
(ปกติไม่ต้องใช้รหัสผ่าน)
ตัวอย่างการตั้งค่า Memcached:
php
public $memcached = [
'host' => '127.0.0.1', // ServBay Memcached อยู่ที่ 127.0.0.1
'port' => 11211, // พอร์ตเริ่มต้น Memcached
'weight' => 1,
];
1
2
3
4
5
2
3
4
5
ตัวอย่างการตั้งค่า Redis:
php
public string $handler = 'redis'; // ตั้งให้ redis เป็น handler หลักของ cache
public $default = [ // กำหนดการเชื่อมต่อ Redis ที่ default
'host' => '127.0.0.1', // ServBay Redis ที่ 127.0.0.1
'password' => null, // โดยปกติไม่มีรหัสผ่าน
'port' => 6379, // พอร์ตเริ่มต้น Redis
'timeout' => 0,
'database' => 0,
];
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
ตรวจสอบว่าได้ตั้งค่าตรงกับประเภทแคชที่เปิดใช้งานไว้ใน ServBay
ตั้งค่าเว็บเซิร์ฟเวอร์ (เว็บไซต์ใน ServBay)
ตั้งค่า Web Server ให้ชี้ไปยังโปรเจกต์ CodeIgniter ผ่านฟีเจอร์เว็บไซต์ใน ServBay
- เปิดแอป ServBay
- ไปที่แท็บ Websites
- คลิกปุ่ม
+
ล่างซ้ายเพื่อเพิ่มเว็บไซต์ใหม่ - กรอกรายละเอียดเว็บไซต์:
- Name: ตั้งชื่อให้ง่ายต่อการจดจำ เช่น
My First CodeIgniter Dev Site
- Domain: ใส่โดเมนที่ต้องการ เช่น
servbay-codeigniter-test.local
(ServBay จะ map.local
ให้ใช้กับเครื่องคุณ) - Site Type: เลือก
PHP
- PHP Version: เลือก PHP เวอร์ชันที่ต้องการ (เช่น
8.3
) - Document Root: สำคัญมาก! CodeIgniter ชี้ entry ที่โฟลเดอร์
public
ในโปรเจกต์ ต้องกำหนดเป็น/Applications/ServBay/www/servbay-codeigniter-app/public
- Name: ตั้งชื่อให้ง่ายต่อการจดจำ เช่น
- กด Add เพื่อบันทึกข้อมูล
- หากปรากฏแจ้งเตือนให้กดยืนยันเพื่อให้นำการตั้งค่าไปใช้จริง
อ่านรายละเอียดแต่ละขั้นได้ที่ การเพิ่มเว็บไซต์แรก
ตัวอย่างโค้ด
เพื่อทดสอบว่าโปรเจกต์รันและเชื่อมต่อฐานข้อมูล/แคชได้จริง ให้แก้ไข Controller Home
ของ CodeIgniter โดยเพิ่มเมธอดตัวอย่าง
เปิดไฟล์ app/Controllers/Home.php
แล้วแทนที่ด้วยโค้ดต่อไปนี้:
php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // ดึงคลาส exception ฐานข้อมูล
use CodeIgniter\Cache\Exceptions\CacheException; // ดึงคลาส exception แคช
class Home extends Controller
{
/**
* เมธอดหน้าแรกเริ่มต้น
*/
public function index(): string
{
// ส่งข้อความต้อนรับแบบง่าย
return '<h1>Hello ServBay and CodeIgniter!</h1><p>Your CodeIgniter project is running on ServBay.</p>';
}
/**
* เมธอดตัวอย่าง Memcached
*/
public function memcached(): string
{
try {
$cache = \Config\Services::cache();
// ทดลองเขียนแคช
$success = $cache->save('servbay_memcached_key', 'Hello Memcached from CodeIgniter!', 60); // แคช 60 วินาที
if (!$success) {
return 'Error: Failed to save data to Memcached. Check Memcached service and configuration.';
}
// ทดลองอ่านแคช
$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) {
// ดักจับข้อผิดพลาดที่เกี่ยวกับแคช
return 'Cache Error: ' . $e->getMessage() . '. Ensure Memcached service is running and configured correctly.';
} catch (\Exception $e) {
// ดักจับข้อผิดพลาดอื่น ๆ
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* เมธอดตัวอย่าง Redis
*/
public function redis(): string
{
try {
$cache = \Config\Services::cache();
// ทดลองเขียนแคช
$success = $cache->save('servbay_redis_key', 'Hello Redis from CodeIgniter!', 60); // แคช 60 วินาที
if (!$success) {
return 'Error: Failed to save data to Redis. Check Redis service and configuration.';
}
// ทดลองอ่านแคช
$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) {
// ดักจับข้อผิดพลาดที่เกี่ยวกับแคช
return 'Cache Error: ' . $e->getMessage() . '. Ensure Redis service is running and configured correctly.';
} catch (\Exception $e) {
// ดักจับข้อผิดพลาดอื่น ๆ
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* เพิ่มข้อมูลผู้ใช้ลงฐานข้อมูล (MySQL/PostgreSQL)
*/
public function addUser(): string
{
try {
$db = \Config\Database::connect();
// ตรวจสอบว่ามี Table 'users' หรือไม่ (ป้องกันข้อผิดพลาด)
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// เพิ่มข้อมูล
$data = [
'name' => 'ServBay Demo User',
'email' => 'user_' . time() . '@servbay.demo', // สร้างอีเมลไม่ซ้ำด้วย time()
];
$db->table('users')->insert($data);
// ตรวจสอบผลการเพิ่มข้อมูล (insert() มักจะคืน true)
// if ($db->affectedRows() > 0) {
return 'User added successfully: ' . $data['email'];
// } else {
// return 'Error: Failed to add user.';
// }
} catch (DatabaseException $e) {
// ดักจับข้อผิดพลาดเกี่ยวกับฐานข้อมูล
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// ดักจับข้อผิดพลาดอื่น ๆ
return 'An unexpected error occurred: ' . $e->getMessage();
}
}
/**
* แสดงรายการผู้ใช้จากฐานข้อมูล (MySQL/PostgreSQL)
*/
public function listUsers(): string
{
try {
$db = \Config\Database::connect();
// ตรวจสอบตาราง users
if (!$db->tableExists('users')) {
return 'Error: "users" table does not exist. Please run database migrations first.';
}
// ดึงข้อมูลผู้ใช้ทั้งหมด
$users = $db->table('users')->get()->getResult();
if (empty($users)) {
return 'No users found in the database.';
}
// แสดงรายชื่อผู้ใช้แบบ JSON
return json_encode($users);
} catch (DatabaseException $e) {
// ดักจับข้อผิดพลาดเกี่ยวกับฐานข้อมูล
return 'Database Error: ' . $e->getMessage() . '. Check database connection and table structure.';
} catch (\Exception $e) {
// ดักจับข้อผิดพลาดอื่น ๆ
return 'An unexpected error occurred: ' . $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 ที่ปรับปรุงใหม่นี้ แสดงข้อความผลลัพธ์ชัดเจนและรองรับการตรวจสอบข้อผิดพลาดเบื้องต้น ช่วยให้ง่ายต่อการวิเคราะห์ปัญหา
ตั้งค่า Routing
เพื่อให้เรียกใช้งานเมธอดใหม่ใน Controller Home
ผ่าน URL ได้ ให้เพิ่ม routing rule ที่ไฟล์ app/Config/Routes.php
ค้นหาส่วนที่มี $routes
แล้วเพิ่มโค้ดต่อไปนี้:
php
// ... กฏ routing อื่น ๆ ...
// Routing สำหรับ Memcached
$routes->get('/memcached', 'Home::memcached');
// Routing สำหรับ Redis
$routes->get('/redis', 'Home::redis');
// Routing สำหรับตัวอย่างฐานข้อมูล
$routes->get('/add-user', 'Home::addUser');
$routes->get('/list-users', 'Home::listUsers');
// ... กฏ routing อื่น ๆ ...
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
หมายเหตุ: อย่าทับ or ลบ routing เดิมที่มีอยู่ เพิ่มเฉพาะส่วนใหม่เข้าไปเท่านั้น
เข้าใช้งานเว็บไซต์
เมื่อตั้งค่าโปรเจกต์และ Web Server เสร็จแล้ว สามารถเข้าถึงผ่านเว็บเบราว์เซอร์ด้วยโดเมนที่ตั้งไว้ข้างต้น
หน้าแรก:
https://servbay-codeigniter-test.local
ถ้า setup สำเร็จจะเห็นข้อความHello ServBay and CodeIgniter!
ทดสอบ Memcached:
https://servbay-codeigniter-test.local/memcached
ถ้าบริการและ config ถูกต้องจะเห็นผลลัพธ์คล้ายMemcached Test Success: Hello Memcached from CodeIgniter!
ทดสอบ Redis:
https://servbay-codeigniter-test.local/redis
ถ้าบริการและ config ถูกต้องจะเห็นผลลัพธ์คล้ายRedis Test Success: Hello Redis from CodeIgniter!
ตัวอย่างการใช้งานฐานข้อมูล (MySQL/PostgreSQL)
ก่อนเรียกตัวอย่างฐานข้อมูล คุณต้องรัน migration เพื่อสร้าง Table users
ก่อน
สร้างฐานข้อมูล (Migration)
เปิด Terminal เข้าโฟลเดอร์โปรเจกต์
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1สร้าง Migration: ใช้ CLI tool สร้างไฟล์ migration สำหรับ Table
users
bashphp spark make:migration create_users_table
1จะได้ไฟล์ PHP ใหม่ใน
app/Database/Migrations
แก้ไขไฟล์ Migration: เปิดไฟล์ใหม่ (ชื่อประมาณ
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
) แล้วเติมโค้ดดังนี้php<?php namespace App\Database\Migrations; use CodeIgniter\Database\Migration; use CodeIgniter\Database\RawSql; // ดึงใช้คลาส 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, // กำหนดอีเมลต้องไม่ซ้ำ ], 'created_at' => [ 'type' => 'TIMESTAMP', // เลือก syntax ตามชนิดฐานข้อมูล // 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()'), // เลือก syntax ให้อัตโนมัติ ], ]); $this->forge->addKey('id', true); // กำหนด id เป็น primary key $this->forge->createTable('users'); // สร้าง table users } public function down() { // ไว้สำหรับ rollback migration $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
51หมายเหตุ: ตัวอย่างข้างต้นจะเลือก default syntax timestamp อัตโนมัติตามฐานข้อมูลที่ใช้งานจริง แนะนำว่าหากใช้งานจริงให้แยก migration สำหรับแต่ละฐานข้อมูลเพื่อความชัวร์
รัน Migration: กลับมาที่ Terminal แล้วรันคำสั่งนี้เพื่อลง migration
bashphp spark migrate
1ถ้าสำเร็จจะมีข้อความแจ้งผลลัพธ์ และสามารถตรวจสอบ Table
users
ได้จาก Adminer
เข้าใช้งานตัวอย่างฐานข้อมูล
ตรวจสอบว่าได้ตั้งค่าการเชื่อมต่อฐานข้อมูลใน app/Config/Database.php
และรัน migration สร้าง Table users
เรียบร้อยแล้ว
เพิ่มข้อมูลผู้ใช้: เข้า
https://servbay-codeigniter-test.local/add-user
ทุกครั้งที่เรียก URL นี้ จะเพิ่มข้อมูลผู้ใช้ใหม่ลง Tableusers
1 แถวพร้อมโชว์ข้อความว่าทำสำเร็จแสดงรายชื่อผู้ใช้: เข้า
https://servbay-codeigniter-test.local/list-users
จะแสดงข้อมูลผู้ใช้ทั้งหมดในฐานข้อมูลแบบ JSON
สรุป
คุณได้เรียนรู้วิธีสร้าง ตั้งค่า และทดสอบ CodeIgniter project บน macOS ด้วย ServBay ทั้งการใช้ Composer ติดตั้งโปรเจกต์, การเพิ่มโปรเจกต์เข้าสู่เว็บไซต์ของ ServBay, การตั้งค่าฐานข้อมูลกับแคช และตัวอย่างโค้ดสำหรับทดสอบว่าระบบเชื่อมต่อกับฐานข้อมูล/แคชได้จริง ServBay ช่วยให้การสร้างและจัดการ local environment เป็นเรื่องง่าย เปิดโอกาสให้คุณได้มุ่งพัฒนาแอป CodeIgniter อย่างเต็มที่