try Lumen to Create API

RuzeriE K.
4 min readMay 22, 2020

--

มีงานด่วนเข้ามา เป็น QR Scanner ที่ต่อกับ Raspberry Pi 4 ทีมเราก็เลยคิดที่จะใช้ PHP ทำ API บน Raspberry Pi เพราะมันพอมั่วๆ ได้และก็เร็วสุดละ

ท่าที่คิดไว้คือ ใช้ Windows 10 OS บน Raspberry จากนั้นก็ลง XAMPP เราก็จะได้ทั้ง server ที่ run PHP และ database เลย ทีแรกก็กะจะใช้ PHP เพียวๆ นี่แหละ แต่พอหาข้อมูลเครื่องมือการทำ API ง่าย ๆ ชื่อ Framework มันก็ โผล่ขึ้นมาให้จิตใจมันไหวหวั่นซะงั้น 😁

ที่เข้าตาคือ Slim กะ Lumen ก็มอง Slim นะ แต่พอไปเจอลิงค์นี้เลยเปลี่ยนใจ กรอปกับเราเองก็เคยใช้ Laravel มาบ้าง และอยากใช้พวก migration, seeder ไรพวกนี้ด้วย Lumen ก็เลยแซงโค้งสุดท้ายไป

พร่ามมาซะยาว ทำซักทีเถอะ

Install

ผมขอข้ามเรื่องการติดตั้ง composer ไปเลยนะ เปิด command line ขึ้นมาแล้วก็จัดตามนี้กันเลย (อย่าลืม cd ไปยังที่ที่ท่านจะสร้างโปรเจ็คก่อนนะ)

composer create-project --prefer-dist laravel/lumen qr-station

เมื่อ install เรียบร้อยแล้ว จากนั้นก็ลอง start Lumen server ดู เราก็ต้อง cd เข้าไปในโฟลเดอร์ qr-station ของเราก่อน จากนั้นก็ใช้คำสั่งนี้ php -S localhost:8000 -t public แล้วก็เปิด localhost:8000 ใน browser ดู ถ้าได้ตามรูปข้างล่างก็แจ่มแมวละ

ผลจากการรัน Lumen server

Config Virtual Host

ทีนี้พอมาลองนึกดูดีๆ ว่าถ้าเอาไปใช้จริง หลังจากติดตั้งทุกอย่างเสร็จ จะสั่งให้ Lumen ทำงานมันก็ต้องมาสั่ง command start server อย่างข้างบนหรอ เกิดไฟดับขึ้นมาทีก็ remote เข้าไป start ที อันนี้แลจะปวดตับนะ ก็เลยลองหาท่าแปลกๆ ดู คืออยากได้เหมือน PHP ปกติอ่ะ ที่แค่เอาโค้ดไปวางใน Apache server ที่รันอยู่ ระบบเราก็ทำงานได้ปกติ ซึ่งทุกเป้าหมายมีหนทาง 555 เจอลิงค์นี่หละ มันคือการ set virtual host ให้กับ Lumen ของชาวเรา

step แรก เราไปตั้ง domain ให้กับโปรเจ็คเราก่อน เปิดไฟล์นี้ขึ้นมา C:\Windows\System32\drivers\etc\hostsแล้วก็เพิ่มบรรทัดนี้เข้าไป 127.0.0.1 station.qr เพื่อที่จะได้มี domain เท่ๆ 😎 ต่อมาก็มาทำ virtual host ต่อ เปิดไฟล์นี้เลย your_xampp_path\apache\conf\extra\httpd-vhosts.conf แล้วก็เพิ่มคำสั่งนี้เข้าไป

<VirtualHost station.qr:80>
DocumentRoot "your_xampp_path/htdocs/your_project/public"
</VirtualHost>

จากนั้นก็ restart apache server ผ่าน XAMPP Control Panel แล้วก็ลองเปิด browser ด้วย url นี้ดู http://station.qr

ok virtual host ใช้ได้ ดีงามฝุดๆ ^^

Create Database

การเตรียมงานยังไม่จบ มันต้องสร้าง database กันก่อน คือปกติหลังจากติดตั้ง XAMPP เราก็จะได้ MySQL ติดมาด้วยในตัว ซึ่งเราก็สามารถเข้าไปสร้าง database ได้เลย อาจจะผ่าน phpMyAdmin ก็ได้ หรือจะใช้ command line ก็ได้ แต่ท่าปกติมันไม่สาแก่ใจ คุมผ่านที่เดียวไปเลย แล้วทำไงละ ก็ให้ Lumen มันจัดการซะเลยซิ concept ง่ายๆ คือ ถ้าไม่มี database ของเราใน MySQL ก็ให้สร้างให้ด้วย ไปเจอวิธีตามลิงค์นี้มา

วิธีก็คือไปสร้าง command ตัวใหม่ใน Lumen โปรเจ็คของเรา ชื่อ db:create ไว้ที่ qr-station\app\Console\Commands\DatabaseCreateCommand.php (code ไปก็อปในลิงค์เอานะ)

ผมติดปัญหาตอน run command ต้องแก้โดยการเปลี่ยนชื่อ function fire() เป็น handle() แทน

แล้วก็ regis command ตัวใหม่เราให้ artisan รู้จัก โดยการเพิ่มคลาสใหม่เข้าไปที่ qr-station\app\Console\Kernel.php ตามด้านล่าง

protected $commands = [
Commands\DatabaseCreateCommand::class,
];

หลังจากนั้นก็มาตั้งค่า database ที่เราจะเชื่อมต่อ โดยการแก้ไขไฟล์ .env ในส่วนของ DB_CONNECTION ตัวอย่างตามด้านล่าง

DB_CONNECTION=mysql
DB_CHARSET=utf8
DB_COLLATION=utf8_general_ci
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=qr_station
DB_USERNAME=your_db_username
DB_PASSWORD=your_db_pass

สุดท้ายก็สั่งให้มันรันคำสั่งใหม่ ด้วย

> cd qr-station
> php artisan db:create
ผลลัพธุ์ที่ได้จากการเรียกใช้ command ตัวใหม่
ลองเช็คดูด้วย phpMyAdmin ก็ได้นะ ^^

Migration

นอกเรื่องเยอะไปหน่อย มาสร้างตารางเก็บข้อมูลกันเถอะ คำศัพท์ migration ก็คงไม่ต้องอธิบายแล้วเนอะ เพราะคนที่ลองจับ framework มา น่าจะเข้าใจความหมายมันเป็นอย่างดีอยู่แล้ว

เริ่มแรกก็แก้ config ใน .env ซะก่อน เซ็ตตามด้านล่างนะ

CACHE_DRIVER=array
QUEUE_DRIVER=database

ส่วนที่ผมจะลองทำก็เป็น คลาสง่ายๆ เอาไว้เก็บค่า config ของระบบของผมเอง หน้าตาก็จะประมาณนี้ (function get() กะ set() ผมแค่ระบุไว้ให้รู้เฉยๆ นะ ว่าแต่ละ field มันจะมี function นี้เป็น default อยู่)

ตัวอย่าง class diagram

เมื่อได้ class design มาละ เราก็จะมาเขียนโค้ด ให้มันสร้างตารางในฐานข้อมูลให้กะเราต่อ Lumen ก็มีเครื่องมือสำหรับสร้าง schema ของตารางให้เราใช้ ก็แค่พิมพ์ใน command ไปว่า

php artisan make:migration create_configs_table
ประมาณนี้

จากคำสั่งข้างต้นมันก็จะไปสร้างไฟล์ migration ให้เราอยู่ที่ qr-station\database\migrations ชื่อไฟล์ก็ตามที่ command ตอบเรามานั่นแหละ เป็น timestamp ตามด้วยคำสั่ง ชื่อตารางก็จะตามที่เราระบุไว้ใน create_xx_table ส่วนรายละเอียดการสร้างฟิลด์ไปดูที่นี่เพิ่มเติมเอานะ ผมขอมั่ว schema ของผมก่อน หน้าตาที่อยากให้เป็นก็ประมาณนี้ครับ

เมื่อกำหนด schema ของเราได้เรียบร้อย ต่อไปก็จะสั่งให้ Lumen สร้างตารางในฐานข้อมูลให้ ด้วย command php artisan migrate

ผลจากการรันคำสั่งเพื่อ migration ตาราง
เช็คด้วย phpMyAdmin

ถ้าดูใน phpMyAdmin จะเห็นว่า Lumen ได้ทำการสร้างตารางให้เราละ แต่จะเห็นตารางแปลกๆ ที่เราไม่ได้สั่งให้สร้างมาตัวนึง คือ migrations ตัวนี้จะเก็บคำสั่งที่เราสร้างตารางไว้ตามลำดับ ลองไปส่องดูได้

Model & Controller

เมื่อมีตารางเก็บข้อมูลใน database แล้ว เราก็มาดูฝั่งโค้ดกันบ้าง ตาม concept ของ Lumen ก็จะใช้โครงของ MVC ทำให้เราต้องสร้าง model และ controller ขึ้นมา

Model จะแทน record ที่อยู่ในตารางที่เราสร้าง โดยเราจะต้องสร้างไฟล์ใหม่ขึ้นมา app\Config.php ด้านในก็จะระบุชื่อตาราง ชื่อฟิลด์หรือคอลัมน์ หน้าตาก็จะประมาณนี้

ส่วน Controller จะเป็นตัวจัดการ request ที่ผู้ใช้ร้องขอเข้ามา ผ่าน RESTful API ซึ่งตาม concept CRUD cycle (CREATE, READ/RETRIEVE, UPDATE, and DELETE) เราก็จะได้หน้าตาของ Controller ประมาณนี้

และก่อนจะไปหัวข้อถัดไป เพื่อจะให้ Lumen ทำงานได้ เราต้องไปเปิดความสามารถเพิ่มให้มันก่อน โดยไปที่ qr-staion\bootstrap\app.php ไปหาคำสั่งด้านล่างในไฟล์ดังกล่าว จากนั้นก็เอา comment ออกซะ

$app->withFacades();
$app->withEloquent();
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(App\Providers\EventServiceProvider::class);

Routing API

มาต่อกันอีกอึดใจหนึ่ง ในที่สุดก็ถึงปลายทางของเราซะที นั่นคือการสร้าง API ถ้าใครอยากอ่านรายละเอียดวิธีการตั้งชื่อ API ที่ดีและความสัมพันธ์ ระหว่าง routing กับ HTTP Method ก็อ่านที่นี่ได้นะครับ ผมขอไม่ลงรายละเอียดนะ (^^)

ใน qr-station\routes\web.php ให้เราทำการกำหนด API route ซึ่งจะผูกกันระหว่าง URL กับ Controller ของเรา ตามด้านล่าง

โปรดสังเกต parameter {name} ต้องตรงกับที่จะรับใน controller นะ

เรียบร้อยแว้วววววว 😍😍😍 ลองเล่นดูดิ๊

เรียกได้ละ bansai bansai bansai

แต่ยังไม่มีข้อมูล 5555

Table Seeders

ว่าจะจบละ แต่มันไม่สุดนี่อ่ะดิ มาต่อกันอีกหน่อย เอาให้อ๊วกกันไป

Seeder คือเครื่องมืออำนวยความสะดวกในการ insert ข้อมูลลงตารางของเรา ส่วนใหญ่ก็จะถูกประยุกต์ใช้ในการสร้าง initial value หรือ testing value ให้เราได้ไว้ใช้เล่นกัน ตัวอย่างข้อมูลที่ผมจะ seed ก็ประมาณนี้ครับ

ตัวอย่างค่า config ที่ผมจะสร้าง

เริ่มกันที่สร้างไฟล์ seeder ขึ้นมา qr-station\database\seeds\ConfigsTableSeeder.php หน้าตาประมาณนี้

จากนั้นใน qr-station\database\seeds\DatabaseSeeder.php ก็ระบุ seeder class ของเราเข้าไป ให้ seeder หลักรู้จัก

public function run() {
$this->call('ConfigsTableSeeder');
}

สุดท้ายสั่ง run ด้วย command line

> composer dump-autoload
> php artisan db:seed

คำสั่งแรก คือการให้ composer สร้าง class map ให้ seeder มันผูกกันก่อน ส่วนคำสั่งที่สอง ก็คือการให้ seeder มันทำงาน ผ่านการเรียกไฟล์ DatabaseSeeder.php

command line console
ข้อมูลเข้าละ ^^
ลองขอข้อมูลผ่าน API ดู มาแว้วววว

try on Postman

สุดท้ายและจริงๆ 😁 เราก็ต้องมาลองของกันหน่อย จะลองใน browser มันก็จำกัดจำเขี่ย เราก็เลยต้องหาเครื่องมือมาช่วยทดสอบการทำงานของ API ของชาวเรา ตัวที่ผมใช้ก็คือ Postman ครับ วิธีใช้งานเบื้องต้นจิ้มดูที่นี่ได้ครับ

API ตัวแรก คือ ลองสร้าง config ใหม่ซักหนึ่งรายการ (ขี้เกียจพิมพ์ละ เดี๋ยวมันจะยาวไป ขอแคปรูปมาละกันนะครับ 👌)

method POST, url http://station.qr/api/v1/configs
ข้อมูลในตารางจาก phpMyAdmin

สร้างใหม่แล้วก็ลองดึงมาดูกัน เคยลองดึงแบบลิสต์ใน browser แล้วนะ รอบนี้ผมขอดึงแบบรายตัวมาดู โดยการส่งชื่อ config ตัวใหม่ที่เราเพิ่งสร้างไป

method GET, url http://station.qr/api/v1/configs/config_name

สุดท้ายที่จะลองให้ดูคือ การลบครับ เพราะตัวนี้ผมไม่ได้ใช้ 😊

method DELETE, url http://station.qr/api/v1/configs/config_name
เช็คในฐานข้อมูลอีกซักรอบเพื่อความชัวน์

เย้ จบแว้วววววว จบแบบจริงๆ 🎉🎉🎉

ขอบคุณที่อ่านนะครับ หวังว่าจะเป็นประโยชน์กับท่านที่อยากจะลองเล่น Lumen เพื่อสร้าง API ไว้ใช้งานกัน

Reference

Lumen API

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

--

--

RuzeriE K.
RuzeriE K.

Written by RuzeriE K.

Like to be a Agriculturist and career is Developer around 10+ years but I feel like, I'm still a novice.

No responses yet

Write a response