การสร้างและรันโปรเจกต์ Slim ใน ServBay
บทความนี้จะแนะนำขั้นตอนการสร้าง ตั้งค่า และรันโปรเจกต์ Slim Framework ที่ใช้ PHP บน ServBay ซึ่งเป็นสภาพแวดล้อมการพัฒนาเว็บแบบโลคอลบน Mac ที่ทรงพลังและใช้งานสะดวกที่สุด ServBay ผสาน PHP, เซิร์ฟเวอร์เว็บ (Caddy/Nginx/Apache) และซอฟต์แวร์ฐานข้อมูลหลากหลายชนิดไว้ในแพ็คเกจเดียว เป็นตัวเลือกที่ยอดเยี่ยมสำหรับการพัฒนา Slim
Slim คืออะไร?
Slim คือเฟรมเวิร์ก PHP แบบ micro-framework ที่มีน้ำหนักเบามาก ออกแบบมาสำหรับการสร้างเว็บและ API อย่างสะดวกรวดเร็ว แต่ยังคงความยืดหยุ่นและมีฟีเจอร์หลักที่จำเป็น เช่น การกำหนดเส้นทาง การรับและส่งข้อมูล เหมาะสำหรับการสร้างโปรโตไทป์ไวๆ โปรเจกต์ขนาดเล็ก-กลาง หรือใช้เป็นรากฐานสำหรับโปรเจกต์ที่ซับซ้อนยิ่งขึ้น
จุดเด่นและข้อดีของ Slim Framework
- น้ำหนักเบา: Core ของ Slim เล็กมาก ใช้ทรัพยากรน้อย โหลดได้ไว เหมาะกับงานขนาดเล็ก-กลาง หรือ microservices
- ยืดหยุ่น: Slim ออกแบบมาให้เสริมฟังก์ชันได้ง่าย สามารถเชื่อมต่อไลบรารีหรือคอมโพเนนต์จาก third-party ได้หลากหลาย (เช่น template engine, ORM, authentication) คุณเลือกได้อิสระตามต้องการ
- ใช้งานง่าย: API กระชับ อธิบายง่าย มีเอกสารรองรับ ทำให้เรียนรู้และใช้งาน Slim ได้รวดเร็ว
- ระบบ Routing ที่ทรงพลัง: รองรับทั้ง GET, POST, PUT, DELETE และ routing ที่ซับซ้อน เช่น group, middleware, parameter capturing
- รองรับ Middleware: สามารถเพิ่มกระบวนการคั่นกลางก่อนและหลังถึง logic หลักของแอป เช่น ระบบยืนยันตัวตน, logging, CORS ฯลฯ
Slim จึงเหมาะกับ RESTful API, งาน prototype เร่งด่วน หรือพัฒนาโมดูลย่อยแบบแยกส่วนอย่างยิ่ง
วิธีสร้างและรันโปรเจกต์ Slim ด้วย ServBay
เนื้อหานี้จะสาธิตการตั้งค่าโปรเจกต์ด้วย PHP ที่บรรจุมาใน ServBay และการใช้ฟีเจอร์ เว็บไซต์ เพื่อตั้งค่าตัว web server ให้เหมาะสมกับการ run Slim framework
ข้อควรเตรียมก่อนเริ่ม
โปรดตรวจสอบให้มั่นใจว่าคุณได้ดำเนินการดังต่อไปนี้เรียบร้อยแล้ว:
- ติดตั้งและเปิดใช้งาน ServBay: ตรวจสอบว่าได้ติดตั้ง ServBay ลงใน macOS และกำลังเปิดแอป ServBay อยู่
- ServBay มาพร้อม Composer แล้ว: ใน ServBay มี Composer ติดตั้งไว้ให้แล้ว ใช้งานได้ทันที ไม่ต้องติดตั้งแยกเอง
การสร้างโปรเจกต์ Slim
ServBay แนะนำให้รวมโปรเจกต์เว็บไซต์ทั้งหมดไว้ในโฟลเดอร์ /Applications/ServBay/www
เพื่อให้ง่ายต่อการจัดการและตั้งค่าสภาพแวดล้อม
- เข้าสู่ไดเรกทอรีรากของเว็บไซต์ใน ServBay:bash
cd /Applications/ServBay/www
1 - สร้างโฟลเดอร์ใหม่สำหรับโปรเจกต์ Slim:bash
mkdir servbay-slim-app
1 - เข้าสู่โฟลเดอร์โปรเจกต์:bash
cd servbay-slim-app
1 - ติดตั้ง Slim ด้วย Composer: สั่ง Composer ติดตั้ง Slim framework พร้อมกับ PSR-7 implementation ในโปรเจกต์bashคำสั่งนี้จะดาวน์โหลด Slim และ
composer require slim/slim "^4.0" slim/psr7 -W
1slim/psr7
เข้าสู่โฟลเดอร์vendor
รวมถึงสร้างไฟล์composer.json
และcomposer.lock
ให้ด้วย
เริ่มต้น Slim Application
- สร้างไฟล์ entrypoint: โดยปกติ Slim จะใช้ไฟล์ entry point เดียว เช่น
public/index.php
สำหรับรับ request ทั้งหมด ให้สร้างโฟลเดอร์public
และไฟล์index.php
ในโปรเจกต์bashmkdir public touch public/index.php
1
2 - แก้ไขไฟล์ Entry point: เปิดไฟล์
public/index.php
แล้วใส่โค้ด Slim เบื้องต้นด้านล่างนี้:phpโค้ดชุดนี้ใช้สร้างแอป Slim ง่ายที่สุด โดยรับ request ที่ root URL (<?php // โหลด autoload ของ Composer require __DIR__ . '/../vendor/autoload.php'; // นำเข้า PSR-7 interface และ factory class ของ Slim use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; // สร้าง instance ของ Slim $app = AppFactory::create(); // เพิ่ม route พื้นฐาน: รับ GET ที่ / $app->get('/', function (Request $request, Response $response, $args) { // เขียนข้อความลงใน response body $response->getBody()->write("Hello ServBay!"); // Return response object return $response; }); // รันแอปพลิเคชัน Slim $app->run();
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22/
) ด้วย GET และตอบกลับ “Hello ServBay!” กลับไป
ตั้งค่าเว็บไซต์ใน ServBay
หากต้องการเข้าถึงโปรเจกต์ Slim ผ่าน browser ต้องตั้งค่า เว็บไซต์ (ใน ServBay เวอร์ชันเก่าเรียกว่า "โฮสต์")
- เปิดหน้าจอแอป ServBay
- ไปที่เมนู เว็บไซต์ (Websites)
- กดเพิ่มเว็บไซต์ใหม่
- กรอกข้อมูลและตั้งค่าตามต้องการเช่น:
- ชื่อ (Name):
My First Slim Dev Site
(หรือชื่ออื่นตามต้องการ) - โดเมน (Domain):
servbay-slim-test.local
(แนะนำให้ใช้.local
หรือ.test
เพื่อการพัฒนาแบบโลคอล) - ประเภทเว็บไซต์ (Website Type):
PHP
- เวอร์ชัน PHP (PHP Version): เลือกเวอร์ชันที่ต้องการ เช่น
8.3
- โฟลเดอร์รากของเว็บไซต์ (Document Root): คลิกเลือกโฟลเดอร์
public
ของโปรเจกต์ เช่น/Applications/ServBay/www/servbay-slim-app/public
(เนื่องจาก Slim ใช้ index.php ในโฟลเดอร์นี้เป็น entry point)
- ชื่อ (Name):
- กดบันทึก ServBay จะจัดการ generate/configure web server ให้อัตโนมัติ
อ่านขั้นตอนตั้งค่าเว็บไซต์อย่างละเอียดได้ที่ เพิ่มเว็บไซต์แรกของคุณ
เข้าถึงเว็บไซต์ Slim ของคุณ
หลังตั้งค่าเสร็จแล้ว ให้เปิด browser แล้วเข้า https://servbay-slim-test.local
หากดำเนินการถูกต้อง ใน browser จะเห็นข้อความ Hello ServBay!
แสดงว่าคุณรัน Slim Framework ผ่านเว็บเซิร์ฟเวอร์ ServBay ได้สำเร็จ
ตัวอย่างการเชื่อมต่อฐานข้อมูล
ตัว Slim เองไม่ได้มีฐานข้อมูลในตัว แต่สามารถเชื่อมโยงกับ PHP database libraries อื่นๆ ได้ไม่ยาก ตัวอย่างนี้จะพูดถึงการใช้ ORM ยอดนิยมอย่าง Eloquent (จาก Laravel) ผ่าน illuminate/database
กับ MySQL, PostgreSQL รวมถึงการเชื่อมต่อ Memcached และ Redis แบบง่ายๆ
ข้อควรเตรียม: สร้างฐานข้อมูล-รัน migration
ก่อนเชื่อมต่อฐานข้อมูล คุณต้องสร้างฐานข้อมูลและสร้างตาราง(Table)บน ServBay ให้ครบถ้วนก่อน
- สร้างฐานข้อมูล:
- เปิดแอป ServBay เลือกฐานข้อมูลที่ต้องการ (MySQL หรือ PostgreSQL)
- ใช้เครื่องมือที่ให้มา (เช่น phpMyAdmin, pgAdmin) หรือ terminal เพื่อสร้างฐานข้อมูลใหม่ เช่น
servbay_slim_app
- รหัสผ่าน root ฐานข้อมูล ServBay ส่วนใหญ่จะเป็น
password
ซึ่งสามารถตรวจสอบหรือเปลี่ยนในแอป ServBay ได้
- ติดตั้งและตั้งค่า Phinx (เครื่องมือ migration): Phinx คือเครื่องมือ migration PHP ที่ช่วยจัดการ schema/database version control
- ติดตั้ง phinx ในโฟลเดอร์โปรเจกต์
/Applications/ServBay/www/servbay-slim-app
bashcomposer require robmorgan/phinx
1 - สร้าง config เบื้องต้น:bashจะได้ไฟล์
vendor/bin/phinx init
1phinx.yml
สำหรับแก้ไขค่าการเชื่อมต่อ เช่น:yamlpaths: migrations: '%%PHINX_CONFIG_DIR%%/db/migrations' seeds: '%%PHINX_CONFIG_DIR%%/db/seeds' environments: default_migration_table: phinxlog default_environment: development # หรือตั้งชื่อ environment อื่น development: # กำหนดค่าตามประเภทฐานข้อมูลที่ใช้ adapter: mysql # หรือ pgsql host: 127.0.0.1 name: servbay_slim_app # ฐานข้อมูลที่สร้าง user: root pass: password # รหัสผ่านฐานข้อมูล port: 3306 # MySQL, PostgreSQL ปกติใช้ 5432 charset: utf8mb4 collation: utf8mb4_unicode_ci version_order: creation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- ติดตั้ง phinx ในโฟลเดอร์โปรเจกต์
- สร้างไฟล์ migration: สร้างไฟล์สำหรับสร้างตาราง usersbashจากนั้นจะแก้ไขใน
vendor/bin/phinx create CreateUsersTable
1db/migrations
โดย methodchange()
ให้สร้างตาราง users ดังนี้:php<?php declare(strict_types=1); use Phinx\Migration\AbstractMigration; final class CreateUsersTable extends AbstractMigration { /** * Change Method. * * Write your reversible migrations using this method. * * More information on writing migrations is available here: * https://book.cakephp.org/phinx/0/en/migrations.html#the-change-method * * Remember to call "create()" or "update()" and NOT "save()" when working * with the Table class. */ public function change(): void { $table = $this->table('users'); $table->addColumn('name', 'string') ->addColumn('email', 'string', ['unique' => true]) ->addTimestamps() // เพิ่มฟิลด์ created_at และ updated_at ->create(); } }
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 - run migration: กลับมารันคำสั่งสร้างตารางจริงbashสำคัญ: ต้องสร้างฐานข้อมูลและตารางให้เรียบร้อยก่อนจะทดสอบ database integration ตัวอย่างในหัวข้อต่อไป
vendor/bin/phinx migrate
1
ใช้งาน illuminate/database
เราจะใช้ illuminate/database
(ORM/Eloquent ของ Laravel)
ติดตั้ง illuminate/database: ที่ root ของโปรเจกต์
bashcomposer require illuminate/database
1ตั้งค่าการเชื่อมต่อใน
public/index.php
: ให้เพิ่มโค้ดต่อไปนี้ หลังrequire __DIR__ . '/../vendor/autoload.php';
และก่อน$app = AppFactory::create();
php// ... ส่วน require และ use อื่นๆ ... use Illuminate\Database\Capsule\Manager as Capsule; // นำเข้า Capsule // เริ่มต้น Eloquent ORM $capsule = new Capsule; // ตั้งค่าการเชื่อมต่อ (ปรับ driver หรือพารามิเตอร์ตามฐานข้อมูล) $capsule->addConnection([ 'driver' => 'mysql', // หรือ 'pgsql' 'host' => '127.0.0.1', 'database' => 'servbay_slim_app', // ฐานข้อมูลของคุณ 'username' => 'root', 'password' => 'password', 'charset' => 'utf8mb4', // แนะนำสำหรับ MySQL 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', // ถ้า PostgreSQL เพิ่ม 'schema' // 'schema' => 'public', ]); // สามารถใช้งาน capsule ได้ทั่วแอป $capsule->setAsGlobal(); // เริ่มใช้งาน Eloquent $capsule->bootEloquent(); // ... สร้าง Slim App instance ...
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
ตัวอย่าง MySQL
สมมติว่าติดตั้ง MySQL ใน ServBay สร้างฐานข้อมูล servbay_slim_app
และ run migration แล้ว
เพิ่มโค้ดต่อไปนี้ใน public/index.php
ก่อน $app->run();
:
php
// ... การตั้งค่าเริ่มต้น และ route '/'
use Illuminate\Database\Capsule\Manager as Capsule; // นำเข้า Capsule
// route เพิ่ม user
$app->get('/mysql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay Demo User',
'email' => 'servbay-demo-' . time() . '@servbay.test', // ใช้ time() เพื่อ unique
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to MySQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500); // แจ้ง error
}
return $response;
});
// route ดึง user ทั้งหมด
$app->get('/mysql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson());
$response = $response->withHeader('Content-Type', 'application/json');
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
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
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
วิธีเรียก:
- เข้า
https://servbay-slim-test.local/mysql-add-user
เพื่อเพิ่ม user ใหม่ - เข้า
https://servbay-slim-test.local/mysql-get-users
เพื่อดึง user ทั้งหมดในรูปแบบ JSON
ตัวอย่าง PostgreSQL
ถ้าติดตั้ง PostgreSQL ใน ServBay แล้วสร้างฐานข้อมูลและรัน migration เตรียมพร้อม
ปรับ config connection ใน public/index.php
โดยเปลี่ยน driver
เป็น pgsql
และเพิ่ม schema
:
php
$capsule->addConnection([
'driver' => 'pgsql', // เปลี่ยนเป็น pgsql
'host' => '127.0.0.1',
'database' => 'servbay_slim_app',
'username' => 'root',
'password' => 'password',
'charset' => 'utf8', // PostgreSQL นิยมใช้ utf8
'prefix' => '',
'schema' => 'public', // กำหนด schema
]);
// ... เหมือนเดิม ...
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
เพิ่ม route ด้านล่างใน public/index.php
ก่อน $app->run();
:
php
// ... การตั้งค่าส่วนต้น และ route '/'
// ... route MySQL (ถ้ามี) ...
use Illuminate\Database\Capsule\Manager as Capsule; // นำเข้า Capsule
// route เพิ่ม user
$app->get('/pgsql-add-user', function (Request $request, Response $response, $args) {
try {
Capsule::table('users')->insert([
'name' => 'ServBay PG Demo User',
'email' => 'servbay-pg-demo-' . time() . '@servbay.test',
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s'),
]);
$response->getBody()->write('User added to PostgreSQL');
} catch (\Exception $e) {
$response->getBody()->write('Error adding user: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// route ดึง user ทั้งหมด
$app->get('/pgsql-get-users', function (Request $request, Response $response, $args) {
try {
$users = Capsule::table('users')->get();
$response->getBody()->write($users->toJson());
$response = $response->withHeader('Content-Type', 'application/json');
} catch (\Exception $e) {
$response->getBody()->write('Error fetching users: ' . $e->getMessage());
$response = $response->withStatus(500);
}
return $response;
});
// ... $app->run();
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
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
วิธีเรียก:
- เข้า
https://servbay-slim-test.local/pgsql-add-user
จะเพิ่ม user ใหม่ใน PostgreSQL - เข้า
https://servbay-slim-test.local/pgsql-get-users
เพื่อดู user ทั้งหมดในฐานข้อมูล PostgreSQL
ตัวอย่าง Memcached
ServBay มีแพ็คเกจ Memcached กับ PHP ext-memcached
ให้พร้อมใช้งาน เพียงติดตั้ง client library เพื่อใช้งานผ่าน PHP เราจะใช้ memcached/memcached
ติดตั้ง Memcached client: ที่ root โปรเจกต์
bashcomposer require memcached/memcached
1เพิ่ม route Memcached ใน
public/index.php
: ก่อน$app->run();
php// ... การตั้งค่าทั้งหมด และ database route ... // route สาธิต Memcached $app->get('/memcached-example', function (Request $request, Response $response, $args) { // สร้าง Memcached client $memcached = new Memcached(); // เพิ่ม server (ServBay รันที่ 127.0.0.1:11211) $memcached->addServer('127.0.0.1', 11211); $cacheKey = 'my_servbay_cache_key'; // ลองดึงข้อมูลจาก cache $cachedData = $memcached->get($cacheKey); if ($cachedData === false) { // ถ้าไม่พบ cache ให้สร้างใหม่และเก็บ cache $cachedData = 'Hello Memcached from ServBay! This was not cached.'; // เก็บลง cache 60 วินาที $memcached->set($cacheKey, $cachedData, 60); $response->getBody()->write($cachedData); } else { // ถ้ามีข้อมูลใน cache แล้ว $response->getBody()->write('Hello Memcached from ServBay! This was served from cache.'); } return $response; }); // ... $app->run();
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
วิธีเรียก: เปิด https://servbay-slim-test.local/memcached-example
ครั้งแรกจะเจอข้อความ “This was not cached.” จากนั้น (ก่อน cache หมดอายุ) จะเป็น “This was served from cache.”
ตัวอย่าง Redis
ServBay ติดตั้ง Redis และ PHP extension ให้เช่นกัน เราจะใช้ไลบรารี predis/predis
ติดตั้ง Redis client: ที่ root โปรเจกต์
bashcomposer require predis/predis
1เพิ่ม route Redis ใน
public/index.php
: ก่อน$app->run();
php// ... การตั้งค่าทั้งหมด และ database/memcached route ... use Predis\Client as RedisClient; // นำเข้า Predis // route สาธิต Redis $app->get('/redis-example', function (Request $request, Response $response, $args) { try { // สร้าง Redis client (ServBay รันที่ 127.0.0.1:6379) $redis = new RedisClient([ 'scheme' => 'tcp', 'host' => '127.0.0.1', 'port' => 6379, ]); $cacheKey = 'my_servbay_redis_cache_key'; // ลองดึงข้อมูลจาก cache $cachedData = $redis->get($cacheKey); if ($cachedData === null) { // หากไม่มีใน cache ให้สร้างใหม่ $cachedData = 'Hello Redis from ServBay! This was not cached.'; // เก็บ cache พร้อม expiry 60 วินาที $redis->setex($cacheKey, 60, $cachedData); $response->getBody()->write($cachedData); } else { // ถ้ามีใน cache ตอบกลับข้อความ cache $response->getBody()->write('Hello Redis from ServBay! This was served from cache.'); } } catch (\Exception $e) { // จัดการ error ในการเชื่อมต่อหรือใช้ Redis $response->getBody()->write('Error connecting to Redis or performing operation: ' . $e->getMessage()); $response = $response->withStatus(500); } return $response; }); // ... $app->run();
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
วิธีเรียก: เข้า https://servbay-slim-test.local/redis-example
ครั้งแรกเจอ “This was not cached.” ถ้ายังไม่หมดอายุ cache จะเป็น “This was served from cache.”
สรุป
จากคู่มือนี้ คุณได้รู้จักวิธีสร้างโปรเจกต์ Slim Framework บนสภาพแวดล้อม ServBay ตั้งค่าเว็บไซต์ให้เข้าถึงจาก browser เชื่อมต่อกับฐานข้อมูลต่างๆ ผ่าน PHP extension และไลบรารี ไม่ว่าจะเป็น MySQL, PostgreSQL, Memcached หรือ Redis ทั้งหมดนี้ช่วยให้คุณตั้งค่าและจัดการสภาพแวดล้อมโลคอลได้ง่ายและใช้งานได้จริง พร้อมโฟกัสกับการเขียนแอป Slim ได้เต็มที่