สร้างและรันโปรเจกต์ ThinkPHP 8 บน ServBay
บทความนี้จะเป็นแนวทางสำหรับการใช้ ServBay ซึ่งเป็นแพลตฟอร์มพัฒนาเว็บท้องถิ่นอันทรงพลัง เพื่อสร้าง ตั้งค่า และรันโปรเจกต์ PHP ด้วยเฟรมเวิร์ก ThinkPHP 8 ได้อย่างรวดเร็ว ServBay มีการเตรียมสภาพแวดล้อม PHP, เว็บเซิร์ฟเวอร์ (Caddy หรือ Nginx) และฐานข้อมูลหลากหลายชนิดไว้ล่วงหน้า ช่วยลดความซับซ้อนในการติดตั้งและจัดการโปรเจกต์ ThinkPHP บนเครื่องของคุณอย่างมาก
ThinkPHP คืออะไร?
ThinkPHP คือเฟรมเวิร์กพัฒนา PHP แบบโอเพนซอร์สเชิงวัตถุ (Object-Oriented) ที่มีต้นกำเนิดจากประเทศจีน โดดเด่นด้านความเรียบง่ายและความเร็ว ถูกออกแบบเพื่อให้เครื่องมือที่สะดวกและทรงพลังสำหรับนักพัฒนาในการสร้างเว็บแอปพลิเคชันยุคใหม่ ด้วยจุดเด่นด้านการใช้งานง่าย ฟีเจอร์อัดแน่น (เช่น ORM อันทรงพลัง, Routing ที่ปรับแต่งได้, Template engine ในตัว, ระบบแคช ฯลฯ) และมีชุมชนนักพัฒนาที่ใหญ่ในประเทศจีน ทำให้ ThinkPHP เป็นที่นิยมใช้ในสายงาน PHP ทั่วเอเชีย
จุดเด่นและข้อดีของ ThinkPHP
- เรียบง่ายและมีประสิทธิภาพ: โครงสร้างโปรเจกต์ชัดเจน เข้าใจง่าย ดูแลง่าย และช่วยให้ทำงานได้เร็วขึ้น
- ฟีเจอร์ครบถ้วน: มีฟีเจอร์ที่เว็บส่วนใหญ่ต้องใช้ เช่น MVC, ORM, Template engine, แคช, การจัดการ session, ระบบยืนยันตัวตน, anti-CSRF token ฯลฯ
- ORM ทรงพลัง: Object-relational mapping ใช้งานง่าย ช่วยให้ทำงานกับฐานข้อมูลสะดวกขึ้น
- Routing ยืดหยุ่น: ปรับแต่งเส้นทาง URL ได้หลากหลาย รองรับโครงสร้างที่ซับซ้อน
- ชุมชนและ ecosystem เติบโต: มีปลั๊กอินและไลบรารีเสริมจำนวนมาก พร้อมด้วยชุมชนนักพัฒนาที่แข็งแกร่ง
- อัปเดตสม่ำเสมอ: อัปเดตตามเวอร์ชัน PHP และแนวโน้มการพัฒนาเว็บอยู่เสมอ
ThinkPHP เหมาะกับโปรเจกต์ทุกขนาด ตั้งแต่เว็บขนาดเล็กจนถึงระบบระดับองค์กรขนาดใหญ่
การติดตั้งโปรเจกต์ ThinkPHP 8 ด้วย ServBay
ServBay คือสภาพแวดล้อมที่เหมาะสมสำหรับการพัฒนา ThinkPHP 8 แบบโลคัล รองรับความต้องการต่าง ๆ ได้แก่
- มี PHP เวอร์ชันต่าง ๆ และ extension สำคัญที่ติดตั้งไว้ล่วงหน้า
- มีเว็บเซิร์ฟเวอร์ (Caddy หรือ Nginx) แบบ built-in ใช้งานง่าย
- รวมฐานข้อมูลหลัก เช่น MySQL, PostgreSQL, MongoDB, Redis, Memcached
- ติดตั้ง Composer สำหรับจัดการ dependency ให้เรียบร้อย
ในคู่มือนี้ เราจะใช้ฟีเจอร์เหล่านี้ของ ServBay เพื่อสร้างโปรเจกต์ ThinkPHP 8 อย่างรวดเร็ว
ข้อกำหนดเบื้องต้น
ก่อนเริ่มต้น โปรดตรวจสอบดังต่อไปนี้:
- ได้ดาวน์โหลดและติดตั้ง ServBay บน macOS เรียบร้อยแล้ว
- ServBay กำลังทำงานอยู่ พร้อม PHP เวอร์ชันที่ต้องการ (ThinkPHP 8 ต้องการอย่างน้อย PHP 8.0) และบริการฐานข้อมูล (MySQL, PostgreSQL, Redis, Memcached ฯลฯ) ที่ต้องใช้เปิดใช้งานแล้ว สามารถตรวจสอบได้จากแท็บ “ซอฟต์แวร์” บนแผงควบคุม ServBay
สร้างโปรเจกต์ ThinkPHP
ServBay แนะนำให้คุณเก็บไฟล์เว็บไซต์ทั้งหมดไว้ที่ /Applications/ServBay/www
เพื่อให้ง่ายต่อการจัดการ
ตรวจสอบการติดตั้ง Composer
ServBay ได้ติดตั้ง Composer มาแล้ว ไม่ต้องติดตั้งเพิ่ม สามารถตรวจสอบเวอร์ชันได้ด้วยคำสั่ง
composer --version
จากเทอร์มินัลใน ServBayสร้างโปรเจกต์ ThinkPHP ด้วย Composer
เปิดเทอร์มินัลบน macOS แล้วใช้คำสั่งด้านล่าง เพื่อสร้างโปรเจกต์ ThinkPHP 8 ใหม่ในโฟลเดอร์รากของเว็บไซต์ใน ServBay
bashcd /Applications/ServBay/www composer create-project topthink/think servbay-thinkphp-app
1
2จะได้โฟลเดอร์ใหม่ชื่อ
servbay-thinkphp-app
อยู่ภายใน/Applications/ServBay/www
และจะมีไฟล์หลักของ ThinkPHP 8 พร้อม dependency ต่าง ๆเข้าโฟลเดอร์โปรเจกต์
เมื่อสร้างเสร็จแล้วให้เข้าไดเรกทอรีของโปรเจกต์
bashcd /Applications/ServBay/www/servbay-thinkphp-app
1
ตั้งค่าโปรเจกต์เบื้องต้น
หลังจากสร้างโปรเจกต์แล้ว ต้องมีการตั้งค่าหลักบางส่วน
ตั้งค่าการเชื่อมต่อฐานข้อมูล
ค่าคอนฟิกฐานข้อมูลหลักของ ThinkPHP จะอยู่ที่ไฟล์
config/database.php
ให้แก้ค่าตามฐานข้อมูลที่คุณเปิดใช้งานใน ServBayตัวอย่างคอนฟิกสำหรับ MySQL โดยใช้ค่าดีฟอลต์ของ ServBay:
php<?php // config/database.php return [ // การตั้งค่าการเชื่อมต่อหลักที่ใช้โดยดีฟอลต์ 'default' => env('database.driver', 'mysql'), // การตั้งค่าการเชื่อมต่อของแต่ละฐานข้อมูล 'connections' => [ 'mysql' => [ // ประเภทฐานข้อมูล 'type' => 'mysql', // ที่อยู่เซิร์ฟเวอร์ 'hostname' => env('database.hostname', '127.0.0.1'), // ชื่อฐานข้อมูล 'database' => env('database.database', 'servbay_thinkphp_app'), // แนะนำให้สร้างฐานข้อมูลใหม่สำหรับแต่ละโปรเจกต์ // ชื่อผู้ใช้ 'username' => env('database.username', 'root'), // รหัสผ่าน 'password' => env('database.password', 'password'), // รหัสผ่านเริ่มต้นของ ServBay ใช้สำหรับเครื่อง local เท่านั้น! // พอร์ต 'hostport' => env('database.hostport', '3306'), // ... การตั้งค่าอื่น ... ], // ... การตั้งค่าฐานข้อมูลอื่น ... ], ];
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ข้อควรระวัง:
- โปรดเปลี่ยนค่าของ
database
ให้ตรงกับชื่อฐานข้อมูลที่คุณสร้างไว้สำหรับโปรเจกต์ (เช่น สร้างฐานข้อมูลใหม่ผ่าน phpMyAdmin หรือ Adminer ของ ServBay ชื่อว่าservbay_thinkphp_app
) - รหัสผ่านของผู้ใช้
root
ใน ServBay คือpassword
ซึ่งใช้ได้ เฉพาะกับการพัฒนาในเครื่องเท่านั้น อย่านำไปใช้ใน production เด็ดขาด! - หากคุณตั้งค่า environment variable ในไฟล์
.env
ให้ค่าที่อยู่ใน.env
มีสิทธิ์ override ค่า default ในconfig/database.php
- โปรดเปลี่ยนค่าของ
ตั้งค่าเว็บเซิร์ฟเวอร์
ไฟล์ทางเข้า (entry file) ของ ThinkPHP คือ public/index.php
และจำเป็นต้องใช้กฎ URL Rewrite เพื่อให้ routing ทำงานอย่างถูกต้อง เนื่องจาก routing ของ ThinkPHP ไม่เหมือนกับเว็บ static ธรรมดา
ในหน้า “ตั้งค่าเว็บไซต์” ของ ServBay ให้เลือกกฎ Rewrite เป็น ThinkPHP
แล้วกดบันทึก
หากต้องการรายละเอียดเพิ่มเติม ดูเพิ่มเติมที่ เพิ่มเว็บไซต์แรก
เพิ่มโค้ดตัวอย่าง
เพื่อเทสการตั้งค่าและ routing ของ ThinkPHP ให้เพิ่ม routing และคอนโทรลเลอร์อย่างง่าย
แก้ไฟล์ /Applications/ServBay/www/servbay-thinkphp-app/route/app.php
เพิ่มโค้ดนี้ลงไป
php
<?php
// route/app.php
use think\facade\Route;
// สร้าง route ชื่อ servbay เมื่อเข้าชม /servbay เรียกใช้ anonymous function
Route::get('servbay', function () {
return 'Hello ServBay!';
});
// ... route อื่น ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
เข้าใช้งานเว็บไซต์
เมื่อทำทุกขั้นตอนแล้ว ให้เปิดเบราว์เซอร์ เข้า URL ที่ตั้งค่าชื่อโดเมนและ routing ตัวอย่างไว้
https://thinkphp.servbay.demo/servbay
ถ้าการตั้งค่าถูกต้อง คุณจะเห็นข้อความ Hello ServBay!
บนหน้าจอ แปลว่าการติดตั้ง ThinkPHP 8 บน ServBay พร้อมใช้งานครบ HTML/PHP-FPM
ตัวอย่างฐานข้อมูล NoSQL
ServBay มีฐานข้อมูล NoSQL อย่าง Memcached และ Redis มาให้พร้อม ThinkPHP สามารถใช้ระบบ cache abstraction layer เพื่อเชื่อมต่อและใช้ฐานข้อมูล NoSQL เหล่านี้ได้ง่าย
ตัวอย่าง Memcached
ตรวจสอบการติดตั้ง Memcached extension
ServBay ติดตั้ง Memcached extension ให้พร้อมใน PHP package เพียงเปิดใช้บริการ Memcached ผ่านแท็บ “ซอฟต์แวร์” ในแผงควบคุมของ ServBay
ตั้งค่าใช้ Memcached เป็นแคช
แก้ไขไฟล์
config/cache.php
เพื่อเปลี่ยน driver เป็น Memcachedphp<?php // config/cache.php return [ // ชนิดแคชเริ่มต้น 'default' => env('cache.driver', 'memcached'), // การตั้งค่าการเชื่อมต่อแคช 'stores' => [ 'memcached' => [ // ประเภทแคช 'type' => 'memcached', // รายการเซิร์ฟเวอร์ 'host' => '127.0.0.1', // Memcached ใน ServBay ใช้ address นี้โดยดีฟอลต์ 'port' => 11211, // พอร์ตเริ่มต้นของ Memcached ใน ServBay 'persistent' => false, 'expire' => 0, 'timeout' => 0, 'prefix' => '', ], // ... ค่าแคชอื่น ... ], ];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23ใช้งาน Memcached ในโค้ด
ใช้
Cache
Facade ของ ThinkPHP ในคอนโทรลเลอร์หรือ routingphp<?php use think\facade\Cache; use think\facade\Route; Route::get('/memcached-example', function () { // เซ็ตค่าแคช อายุ 600 วินาที Cache::set('my_memcached_key', 'This value is from Memcached!', 600); // ดึงค่าแคช $value = Cache::get('my_memcached_key'); return 'Value from Memcached: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13ทดสอบได้ที่
https://thinkphp.servbay.demo/memcached-example
ตัวอย่าง Redis
ตรวจสอบการติดตั้ง Redis extension
ServBay ติดตั้ง Redis extension ใน PHP package ให้พร้อม แค่เปิดบริการ Redis ผ่านแผงควบคุม
ตั้งค่า Redis เป็นแคช
แก้ไขไฟล์
config/cache.php
เพื่อให้ ThinkPHP ใช้ Redis เป็นแคชphp<?php // config/cache.php return [ // ชนิดแคชเริ่มต้น 'default' => env('cache.driver', 'redis'), // การตั้งค่าการเชื่อมต่อแคช 'stores' => [ 'redis' => [ // ประเภทแคช 'type' => 'redis', // ที่อยู่เซิร์ฟเวอร์ 'host' => env('cache.host', '127.0.0.1'), // Redis ใน ServBay ใช้ address นี้โดยดีฟอลต์ // พอร์ต 'port' => env('cache.port', 6379), // พอร์ตเริ่มต้น // รหัสผ่าน (โดยดีฟอลต์ไม่มีรหัสผ่าน) 'password' => env('cache.password', ''), 'select' => 0, 'timeout' => 0, 'expire' => 0, 'persistent' => false, 'prefix' => '', ], // ... ค่าแคชอื่น ... ], ];
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หมายเหตุ: ดีฟอลต์ของ Redis ใน ServBay จะไม่ตั้งรหัสผ่าน หากคุณตั้งรหัสผ่านเอง ให้ใส่ในช่อง
password
ใช้งาน Redis ในโค้ด
ใช้
Cache
Facade ของ ThinkPHP ใน routing หรือคอนโทรลเลอร์php<?php use think\facade\Cache; use think\facade\Route; Route::get('/redis-example', function () { // เซ็ตแคชถาวร (หรือตั้งเวลาได้โดยเพิ่มพารามิเตอร์) Cache::set('my_redis_key', 'Hello from Redis!'); // ดึงค่าแคช $value = Cache::get('my_redis_key'); return 'Value from Redis: ' . $value; });
1
2
3
4
5
6
7
8
9
10
11
12
13ทดสอบที่
https://thinkphp.servbay.demo/redis-example
ตัวอย่างฐานข้อมูลเชิงสัมพันธ์ (Relational Database)
ServBay รองรับ MySQL กับ PostgreSQL ได้อย่างสมบูรณ์ ThinkPHP ORM ช่วยให้เชื่อมต่อและทำงานกับฐานข้อมูลเหล่านี้ง่ายมาก
เครื่องมือ Migration ของ ThinkPHP
ThinkPHP มี migration tool สำหรับบริหาร schema ฐานข้อมูล ช่วยจัดการโครงสร้างและ sync ข้อมูลระหว่างทีม
ติดตั้ง migration tool
ที่ root ของโปรเจกต์ รันคำสั่งติดตั้ง extension migration
bashcd /Applications/ServBay/www/servbay-thinkphp-app composer require topthink/think-migration
1
2สร้างไฟล์ migration
ใช้คำสั่ง ThinkPHP CLI เพื่อสร้าง migration ไฟล์ใหม่ (ตัวอย่าง: สำหรับตาราง users)
bashphp think migrate:create CreateUserTable
1จะสร้างไฟล์ migration ใหม่ในโฟลเดอร์
database/migrations
ชื่อเช่น20231027100000_create_user_table.php
แก้ไฟล์ migration
เปิดไฟล์ที่เพิ่งสร้าง แล้วตั้งค่าฟิลด์ของตาราง users
php<?php // database/migrations/YYYYMMDDHHMMSS_create_user_table.php use think\migration\Migrator; use think\migration\db\Column; class CreateUserTable extends Migrator { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * http://docs.phinx.org/en/latest/migrations.html#the-change-method * * The following commands can be used in this method and Phinx will * automatically reverse them when rolling back: * * createTable * renameTable * addColumn * addCustomColumn * renameColumn * addIndex * addForeignKey * createDatabase * renameDatabase * dropTable * dropColumn * dropIndex * dropForeignKey */ public function change() { // สร้างตาราง users $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => 'ชื่อผู้ใช้']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => 'อีเมล']) ->addIndex(['email'], ['unique' => true]) // เพิ่ม unique index ที่อีเมล ->addTimestamps() // เพิ่มฟิลด์ created_at และ updated_at ->create(); // สร้างตาราง } // หากไม่ใช้ change method สามารถแยกกำหนด up และ down ได้ /* public function up() { $table = $this->table('users'); $table->addColumn('name', 'string', ['limit' => 50, 'comment' => 'ชื่อผู้ใช้']) ->addColumn('email', 'string', ['limit' => 100, 'comment' => 'อีเมล']) ->addIndex(['email'], ['unique' => true]) ->addTimestamps() ->create(); } public function down() { $this->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
52
53
54
55
56
57
58
59
60
61
62รัน migration
กลับไปยัง root directory ของโปรเจกต์ (ใน ServBay terminal) จากนั้นรัน
bashphp think migrate:run
1ถ้าสำเร็จ ตาราง
users
จะถูกสร้างในฐานข้อมูลของคุณ
ตัวอย่าง MySQL
สมมติว่าคุณเปิดใช้งาน MySQL ผ่าน ServBay และตั้งค่าการเชื่อมต่อใน config/database.php
ไว้แล้ว
ตรวจสอบการเชื่อมต่อ MySQL
ตรวจสอบค่าการเชื่อมต่อใน “ตั้งค่าเบื้องต้นของโปรเจกต์” ให้ครบถ้วน
เพิ่มข้อมูลผู้ใช้ผ่านโค้ด
ใช้ ThinkPHP
Db
Facade หรือ ORM ในการ insert ข้อมูล (ตัวอย่างนี้ใช้ Db Facade)php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-add-user', function () { try { Db::table('users')->insert([ 'name' => 'ServBay Demo User', 'email' => '[email protected]', // ใช้อีเมลตัวอย่างของแบรนด์ 'created_at' => date('Y-m-d H:i:s'), // ถ้า addTimestamps() ไม่ auto ให้เซ็ตเอง 'updated_at' => date('Y-m-d H:i:s'), ]); return 'User added successfully!'; } catch (\Exception $e) { return 'Error adding user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17เข้าเว็บ
https://thinkphp.servbay.demo/mysql-add-user
เพื่อลองเพิ่มข้อมูลดึงข้อมูลผู้ใช้จากฐานข้อมูล
ใช้ Db Facade หรือตัว ORM Query
php<?php use think\facade\Db; use think\facade\Route; Route::get('/mysql-users', function () { $users = Db::table('users')->select(); // ดึงข้อมูล user ทั้งหมด return json($users); // ส่งผลลัพธ์ออกแบบ JSON });
1
2
3
4
5
6
7
8เข้าเว็บ
https://thinkphp.servbay.demo/mysql-users
เพื่อดูข้อมูลในusers
table
ตัวอย่าง PostgreSQL
สมมติว่าคุณเปิดใช้ PostgreSQL บน ServBay และกำหนดค่าการเชื่อมต่อเรียบร้อย
ตั้งค่าการเชื่อมต่อ PostgreSQL
เช็ค config ใน
config/database.php
ให้มีค่าเชื่อมต่อดังนี้php<?php // config/database.php (บางส่วน) return [ // ... ตัวแปรอื่น ... 'connections' => [ // ... การตั้งค่า MySQL ... 'pgsql' => [ // ประเภทฐานข้อมูล 'type' => 'pgsql', // ที่อยู่เซิร์ฟเวอร์ 'hostname' => env('database.hostname', '127.0.0.1'), // ชื่อฐานข้อมูล 'database' => env('database.database', 'servbay_thinkphp_app'), // ชื่อผู้ใช้ 'username' => env('database.username', 'root'), // รหัสผ่าน 'password' => env('database.password', 'password'), // พอร์ต 'hostport' => env('database.hostport', '5432'), // ... การตั้งค่าอื่น ... ], // ... ฐานข้อมูลอื่น ... ], ];
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ข้อควรระวัง:
- เช่นเดียวกับ MySQL แนะนำให้สร้าง database สำหรับโปรเจกต์โดยเฉพาะ
- รหัสผ่าน root ของ PostgreSQL ใน ServBay เป็น
password
เช่นกัน เหมาะสำหรับใช้งาน local เท่านั้น
เพิ่มข้อมูลผู้ใช้ลง PostgreSQL
ใช้ ThinkPHP
Db
Facade หรือ ORM เช่นเดิม แต่ระบุเชื่อมต่อ pgsqlphp<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-add-user', function () { try { Db::connect('pgsql')->table('users')->insert([ // ใช้คอนเนกชัน pgsql 'name' => 'ServBay PgSQL User', 'email' => '[email protected]', 'created_at' => date('Y-m-d H:i:s'), 'updated_at' => date('Y-m-d H:i:s'), ]); return 'PostgreSQL User added successfully!'; } catch (\Exception $e) { return 'Error adding PostgreSQL user: ' . $e->getMessage(); } });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17เข้าเว็บ
https://thinkphp.servbay.demo/pgsql-add-user
เพื่อลองเพิ่มข้อมูลผู้ใช้ดึงข้อมูลผู้ใช้จาก PostgreSQL
ใช้ Facade หรือ ORM โดย specify เชื่อมต่อ pgsql
php<?php use think\facade\Db; use think\facade\Route; Route::get('/pgsql-users', function () { $users = Db::connect('pgsql')->table('users')->select(); // ดึงข้อมูลจาก pgsql return json($users); });
1
2
3
4
5
6
7
8เข้าเว็บ
https://thinkphp.servbay.demo/pgsql-users
เพื่อดูข้อมูล
สรุป
หลังทำตามขั้นตอนทั้งหมด คุณได้สร้าง ตั้งค่า และรันโปรเจกต์ ThinkPHP 8 บนเครื่องผ่าน ServBay สำเร็จแล้ว พร้อมกับใช้งาน Composer, ตั้งค่าเว็บเซิร์ฟเวอร์ Caddy ให้รองรับ routing, เชื่อมต่อและใช้งานฐานข้อมูล MySQL, PostgreSQL, Memcached และ Redis ที่ ServBay เตรียมไว้
ServBay ช่วยลดความยุ่งยากในการติดตั้งและจัดการสภาพแวดล้อมการพัฒนา PHP โดยเฉพาะกับ ThinkPHP และเฟรมเวิร์กอื่น ๆ คุณจึงสามารถโฟกัสกับการพัฒนา business logic ได้อย่างเต็มที่ จากนี้ไปก็เริ่มพัฒนาโปรเจกต์ ThinkPHP ต่อได้เลย พร้อมใช้ความสามารถและ package ต่าง ๆ ที่ ServBay มีให้แบบจัดเต็ม!