สร้างและใช้งานโปรเจ็กต์ CodeIgniter
CodeIgniter คืออะไร?
CodeIgniter คือเฟรมเวิร์ก PHP เพื่อพัฒนาเว็บแอปพลิเคชันแบบน้ำหนักเบาและมีประสิทธิภาพสูง โดยยึดหลัก Model-View-Controller (MVC) ช่วยให้นักพัฒนาสร้างเว็บแอปฟีเจอร์ครบได้อย่างรวดเร็ว โครงสร้างเรียบง่าย ใช้งานง่าย และประสิทธิภาพยอดเยี่ยมจึงได้รับความนิยมอย่างมากในกลุ่มนักพัฒนา PHP
คุณสมบัติเด่นและข้อดีของ CodeIgniter
- แกนระบบเบา: โครงสร้างหลักของ CodeIgniter มีเฉพาะส่วนประกอบพื้นฐานที่จำเป็น ทำงานรวดเร็ว
- ประสิทธิภาพดีเยี่ยม: ออกแบบให้รองรับการทำงานแบบ concurrent และตอบสนองได้เร็ว
- เริ่มต้นง่าย: มีเอกสารชัดเจนและ API เข้าใจง่าย นักพัฒนาจึงเริ่มต้นได้เร็ว
- ยืดหยุ่นสูง: สามารถเลือกใช้งานหรือเชื่อมต่อกับไลบรารี third-party ได้ตามต้องการ
- ชุมชนสนับสนุนแข็งแกร่ง: มีกลุ่มนักพัฒนาขนาดใหญ่ช่วยแนะนำและแบ่งปันตัวอย่างการใช้งาน
CodeIgniter เหมาะกับโครงการที่มีขนาดตั้งแต่เล็กจนถึงระดับ Enterprise และช่วยให้นักพัฒนาเขียนเว็บคุณภาพสูงได้อย่างมีประสิทธิภาพ
สร้างสภาพแวดล้อม CodeIgniter ด้วย ServBay
ServBay คือเครื่องมือสำหรับสร้างสภาพแวดล้อมเว็บแบบ local ทั้งบน macOS และ Windows มี PHP หลากหลายเวอร์ชัน ฐานข้อมูล (MySQL, PostgreSQL, MongoDB) ระบบแคช (Redis, Memcached) และเว็บเซิร์ฟเวอร์ (Caddy, Nginx, Apache) ให้ใช้งาน พร้อมหน้าจอบริหารจัดการที่ใช้ง่าย โดยคุณสามารถติดตั้งและควบคุมสภาพแวดล้อมสำหรับ CodeIgniter ได้อย่างสะดวก
บทความนี้จะแนะนำวิธีใช้ PHP และฟังก์ชัน “เว็บไซต์” ใน ServBay ในการสร้าง ตั้งค่า และรันโปรเจ็กต์ CodeIgniter พร้อมสาธิตการเชื่อมต่อหลายฐานข้อมูลและระบบแคช
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น กรุณาตรวจสอบว่าคุณได้ดำเนินการดังนี้แล้ว:
- ได้ติดตั้งและใช้งาน ServBay (macOS หรือ Windows) เสร็จสมบูรณ์
- เปิดใช้งาน PHP เวอร์ชันที่ต้องการบน ServBay (เช่น PHP 8.3)
- เปิดใช้งานซอฟต์แวร์ฐานข้อมูลและแคชที่ต้องการใน ServBay (เช่น MySQL, PostgreSQL, Redis, Memcached)
การสร้างโปรเจ็กต์ CodeIgniter
ServBay แนะนำให้จัดเก็บไฟล์เว็บไซต์ไว้ในโฟลเดอร์ต่อไปนี้ เพื่อบริหารจัดการ Local site ได้สะดวก:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
ติดตั้ง Composer
ServBay มาพร้อม Composer ติดตั้งไว้ในตัวแล้ว (อ่านรายละเอียด) คุณสามารถใช้คำสั่ง
composer
ใน terminal ได้ทันทีเข้าสู่โฟลเดอร์หลักของเว็บไซต์
เปิด terminal และเข้าไปยัง root directory ที่แนะนำ:
macOS:
bashcd /Applications/ServBay/www
1Windows:
cmdcd C:\ServBay\www
1สร้างโปรเจ็กต์ CodeIgniter
ใช้ Composer สร้างโปรเจ็กต์ CodeIgniter 4 ใหม่ ตั้งชื่อว่า
servbay-codeigniter-app
:bashcomposer create-project codeigniter4/appstarter servbay-codeigniter-app
1Composer จะดาวน์โหลด CodeIgniter skeleton และ dependency ไปยังโฟลเดอร์นี้
เปลี่ยนเข้าโฟลเดอร์โปรเจ็กต์
เข้าสู่โฟลเดอร์โปรเจ็กต์ที่สร้างขึ้นใหม่:
macOS:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1Windows:
cmdcd C:\ServBay\www\servbay-codeigniter-app
1
การตั้งค่าเริ่มต้น
กำหนดค่าการเชื่อมต่อฐานข้อมูล
การตั้งค่าฐานข้อมูลของ CodeIgniter อยู่ในไฟล์ app/Config/Database.php
ก่อนใช้งานฐานข้อมูล ต้องกรอกข้อมูลเชื่อมต่อในไฟล์นี้ให้ถูกต้อง
หากต้องการใช้ฐานข้อมูล ให้สร้างฐานข้อมูลชื่อ servbay_codeigniter_app
ผ่าน ServBay (แนะนำ Adminer หรือ phpMyAdmin ผ่านเมนูในแอป)
จากนั้นให้แก้ไขไฟล์ app/Config/Database.php
ตรงอาร์เรย์ $default
โดยใช้ข้อมูลตามฐานข้อมูลที่เปิดใช้งาน เช่น MySQL หรือ PostgreSQL โดย username และ password ของ ServBay โดยปกติคือ root
และ password
ตัวอย่างการตั้งค่า MySQL:
php
public $default = [
'DSN' => '',
'hostname' => '127.0.0.1', // ServBay ฐานข้อมูลมัก listen ที่ 127.0.0.1
'username' => 'root', // ผู้ใช้เริ่มต้นของ ServBay
'password' => 'password', // รหัสผ่านเริ่มต้น
'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
อาจต้องปรับแต่ง setting charset ตามชนิดฐานข้อมูลนั้นๆ
กำหนดค่าการเชื่อมต่อแคช (Memcached/Redis)
กรณีใช้งาน Memcached หรือ Redis ให้ตั้งค่าที่ไฟล์ app/Config/Cache.php
Memcached ตั้งค่าพอร์ตเป็น 11211
ส่วน Redis พอร์ต 6379
โดยปกติไม่ต้องใช้รหัสผ่าน
ตัวอย่างการตั้งค่า Memcached:
php
public $memcached = [
'host' => '127.0.0.1', // ServBay Memcached listen ที่ 127.0.0.1
'port' => 11211, // พอร์ต Memcached มาตรฐาน
'weight' => 1,
];
1
2
3
4
5
2
3
4
5
ตัวอย่างการตั้งค่า Redis:
php
public string $handler = 'redis'; // กำหนด handler เป็น redis
public $default = [ // ตั้งค่า Redis ที่ default array
'host' => '127.0.0.1', // ServBay Redis listen ที่ 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
ตรวจสอบให้แน่ใจว่าเลือก type และตั้งค่าตามซอฟต์แวร์ที่เปิดใช้งานใน ServBay
ตั้งค่าเว็บเซิร์ฟเวอร์ (การตั้งค่าเว็บไซต์ใน ServBay)
ใช้ฟีเจอร์ "เว็บไซต์" (Websites) ใน ServBay เพื่อกำหนดค่าเว็บเซิร์ฟเวอร์ชี้ไปยังโปรเจ็กต์ CodeIgniter ของคุณ
- เปิดโปรแกรม ServBay
- ไปที่แท็บ เว็บไซต์ (Websites)
- กดปุ่ม
+
ที่ด้านล่างซ้ายเพื่อเพิ่มเว็บไซต์ใหม่ - กรอกข้อมูลเว็บไซต์:
- ชื่อ (Name): ตั้งชื่อเพื่อให้ง่ายต่อการระบุ เช่น
My First CodeIgniter Dev Site
- โดเมน (Domain): ตั้งโดเมน local เช่น
servbay-codeigniter-test.local
(ServBay จะ map.local
ไปยังเครื่องของคุณโดยอัตโนมัติ) - ประเภทเว็บไซต์ (Site Type): เลือก
PHP
- เวอร์ชัน PHP (PHP Version): เลือกเวอร์ชันที่ต้องการใช้งาน เช่น
8.3
- Document Root: สำคัญมาก! ไฟล์เข้าใช้งานของ CodeIgniter คือ
index.php
ในโฟลเดอร์public
ของโปรเจ็กต์ ดังนั้น ต้องระบุโฟลเดอร์นี้เช่น/Applications/ServBay/www/servbay-codeigniter-app/public
- ชื่อ (Name): ตั้งชื่อเพื่อให้ง่ายต่อการระบุ เช่น
- กด เพิ่ม (Add) เพื่อบันทึก
- หาก ServBay แจ้งว่าต้องปรับเปลี่ยนค่าใหม่ ให้ยืนยัน
ดูวิธีการตั้งค่ารายละเอียดที่ เพิ่มเว็บไซต์แรก
เพิ่มตัวอย่างโค้ด
เพื่อทดลองว่าเว็บไซต์ทำงานและทดสอบการเชื่อมต่อฐานข้อมูลและแคช ให้ปรับไฟล์คอนโทรลเลอร์ Home
ใน app/Controllers/Home.php
เป็นโค้ดด้านล่าง:
php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use CodeIgniter\Database\Exceptions\DatabaseException; // เพิ่มคลาสจัดการข้อผิดพลาดฐานข้อมูล
use CodeIgniter\Cache\Exceptions\CacheException; // เพิ่มคลาสจัดการข้อผิดพลาดแคช
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();
// ตรวจสอบว่ามีตาราง '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);
// ผลลัพธ์การเพิ่มข้อมูล
return 'User added successfully: ' . $data['email'];
} 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
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
คอนโทรลเลอร์ที่ปรับใหม่นี้จะช่วยให้ตรวจสอบสถานะการเชื่อมต่อและข้อผิดพลาดได้สะดวกขึ้น
ตั้งค่า Routing
เพื่อให้เรียกใช้งานเมธอดตัวอย่างที่เพิ่มใน Home
controller ผ่าน URL ได้ ให้เพิ่ม Route ลงในไฟล์ app/Config/Routes.php
ตรงที่กำหนด $routes
ดังนี้:
php
// ... กฎ routing อื่นๆ ...
// ตัวอย่าง Route สำหรับ Memcached
$routes->get('/memcached', 'Home::memcached');
// ตัวอย่าง Route สำหรับ Redis
$routes->get('/redis', 'Home::redis');
// ตัวอย่าง Route สำหรับฐานข้อมูล
$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
อย่าลืมเพิ่ม Route เหล่านี้ในส่วน $routes
โดยไม่ลบหรือเขียนทับ Routing ที่มีเดิม
การเข้าใช้งานเว็บไซต์
เมื่อเซ็ตอัปโปรเจกต์ CodeIgniter ใน ServBay เรียบร้อย ให้เปิดเว็บเบราว์เซอร์และเข้าด้วยโดเมนที่ตั้งไว้:
หน้าแรก:
https://servbay-codeigniter-test.local
ควรเห็นข้อความ “Hello ServBay and CodeIgniter!” แสดงว่าโปรเจ็กต์รันบนเซิร์ฟเวอร์ของ ServBay สำเร็จตัวอย่าง Memcached:
https://servbay-codeigniter-test.local/memcached
ถ้าตั้งค่า Memcached ถูกต้อง ควรเห็น “Memcached Test Success: Hello Memcached from CodeIgniter!”ตัวอย่าง Redis:
https://servbay-codeigniter-test.local/redis
หากการตั้งค่า Redis สำเร็จ จะเห็น “Redis Test Success: Hello Redis from CodeIgniter!”
ตัวอย่างการใช้งานฐานข้อมูล (MySQL/PostgreSQL)
ก่อนใช้ฟีเจอร์ฐานข้อมูล ต้องรัน migration เพื่อสร้างตาราง users
สร้างโครงสร้างฐานข้อมูล (Run Migration)
เปิด terminal เข้าไปที่โปรเจ็กต์ CodeIgniter:
bashcd /Applications/ServBay/www/servbay-codeigniter-app
1สร้างไฟล์ Migration: ใช้ CLI ของ CodeIgniter สร้าง migration สำหรับตาราง
users
:bashphp spark make:migration create_users_table
1จะมีไฟล์ใหม่สร้างในโฟลเดอร์
app/Database/Migrations
แก้ไขไฟล์ Migration: เปิดไฟล์ที่สร้างใหม่ (ชื่อประมาณ
YYYY-MM-DD-HHMMSS_CreateUsersTable.php
), กำหนดฟังก์ชันup()
เพิ่มโครงสร้างตาราง เช่น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, // ฟิลด์ email ต้องไม่ซ้ำ ], 'created_at' => [ 'type' => 'TIMESTAMP', // เลือกค่า default timestamp ตามชนิดฐานข้อมูล // 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); // กำหนด primary key ที่ id $this->forge->createTable('users'); } public function down() { // หากย้อน migration ให้ลบตาราง 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
51หมายเหตุ: ตัวอย่างนี้เลือกค่า timestamp default ตามชนิดฐานข้อมูล (MySQL หรือ PostgreSQL) หากโปรเจกต์ขนาดใหญ่ อาจแบ่ง migration ตามฐานข้อมูลแต่ละประเภท
รัน Migration: ใช้คำสั่งด้านล่างสร้างตารางในฐานข้อมูล:
bashphp spark migrate
1หากสำเร็จ จะเห็นข้อความยืนยัน สามารถตรวจสอบผ่านเครื่องมือฐานข้อมูลใน ServBay ( เช่น Adminer ) ได้ว่ามีตาราง
users
แล้ว
เข้าใช้งานตัวอย่างฐานข้อมูล
ตรวจสอบให้แน่ใจว่าตั้งค่าการเชื่อมต่อฐานข้อมูลใน app/Config/Database.php
ถูกต้อง และได้รัน migration สร้างตารางแล้ว
เพิ่มผู้ใช้ใหม่: เข้า
https://servbay-codeigniter-test.local/add-user
ทุกครั้งที่เข้า จะเพิ่มผู้ใช้ใหม่ในตารางusers
โดยแสดงข้อความ “User added successfully: user_XXXXXXXXXX@servbay.demo”แสดงรายชื่อผู้ใช้ทั้งหมด: เปิด
https://servbay-codeigniter-test.local/list-users
จะแสดงรายการผู้ใช้ทั้งหมดในรูปแบบ JSON
สรุป
หลังดำเนินการตามขั้นตอนนี้ คุณจะสามารถสร้าง ตั้งค่า และรันโปรเจ็กต์ CodeIgniter บน ServBay ได้ทั้งใน macOS และ Windows รวมถึงเชื่อมต่อฐานข้อมูลและระบบแคชได้จริง คุณได้เรียนรู้การใช้ Composer สร้างโปรเจ็กต์ การตั้งค่าเว็บไซต์ใน ServBay การกำหนดค่า database/cache ของ CodeIgniter และการทดสอบด้วยโค้ดตัวอย่าง ServBay จะช่วยให้คุณตั้งค่าสภาพแวดล้อม local ได้สะดวก สามารถโฟกัสกับการพัฒนาเว็บแอปด้วย CodeIgniter ได้เต็มที่