ทำ restful api ในภาษา Lumen แบบเจ็มจนกัน

Sutthipong Nuanma
Amiearth
Published in
5 min readMar 9, 2019

จากบทความที่แล้วเราสอนภาษา Lumen เบื่องต้นกันไปแล้วถ้าใครยังไม่ได้อ่านตาม link ข้างใต้เลย

เพราะบทความนี้จะถูกต่อยอดจากบทความข้างบน ถ้าใครยังไม่ได้อ่าน รีบกลับไปอ่านโดยด่วนเลย

และวันนี้เราจะมาพูดถึงการทำ api ให้คนอื่นนำไปใช้นะครับ สำหรับความหมาย api ผมจะขอไม่อธิบายใน blog นี้เนาะ เดียวจะเปิด วาร์ปให้เพื่อนๆไปอ่านต่อกันนะ 👇🏼👇🏼

เริ่มติดตั้ง lumen

composer create-project --prefer-dist laravel/lumen Lumen_api

เพื่อที่จะทำการเริ่มสร้าง Api เชื่อมกับ ฐานข้อมูลเราจะ mockup Api ไว้ก่อน

ระหว่างนี้จิบชา หรือ กาแฟ รอได้เลยเพราะจะใช้เวลาประมาณนึงได้ 🍵 ☕️🍵 ☕️

เริ่มสร้าง Controller เพื่อ mock up API

มาเริ่มสร้าง file กันเลยที่ app/Http/Controller แล้วจะสร้าง file ชื่อว่า UserController.php ขึ้นมานะครับ

และจากนั้นเราก็จะไปสร้าง route เพื่อดึง controller ตัวนี้ไปใช้กันครับโดยไปที่ routes/web.php

มาลอง postman กันถ้า เหมือนกันแปลว่าถูกต้อง 😳😳😳

สร้างฐานข้อมูลเพื่อไปดึงข้อมูลมาแสดง

มาเริ่มสร้างฐานข้อมูลกัน ผมจะใช้ phpmyadmin นะครับ เข้าไปที่ http://localhost/phpmyadmin จะเห็นหน้าตา แบบนี้ขึ้นมา

จากนั้นทำการกด New แล้วเราจะทำการกรอกข้อมูลฐานข้อมูลที่เราต้องการสร้างเข้าไป ผมจะใช้ชื่อ Lumen_api แล้วก็เลือก utf8_general_ci เพื่อให้รองรับภาษาไทย แล้วก็ create ด้เลย

แล้วเราจะกดเข้าฐานข้อมูลที่เราสร้าง Lumen_api แล้วไปสร้าง table ชื่อว่า user แล้วก็ สร้าง columns 4 กด Go เลย

จากนั้นเราจะมาสร้าง field แต่ละตัวกัน

id int สำคัญมากติ้กที่ A_I ด้วยเพื่อให้เป็น Primary และ Auto run id

name varchar 100 : เราจะเก็บชื่อเป็นตัวอักษร จำนวนไม่เกิน 100

age int : เราจะสร้าง age เป็น int

tel varchar 30 : เก็บข้อมูล เบอร์โทรศัพท์ เป็นอักษรไม่เกิน 30 นี้เก็บเกินไว้เพื่อ 😯

Save

จากนั้นเราจะ การเพิ่มข้อมูลกันก่อนไปที่เมนู insert แล้วทำการเพิ่มข้อมูลลงไป เราจะไม่เพิ่มตรง id นะครับ เพราะเราตั้งมันเป็น auto ตรงที่ A_I อยู่แล้ว จากนั้นกด Go

จากนั้นกดไปที่เมนู Browse ว่าขึ้นเหมือนกันไหม ถ้าขึ้นเหมือนกัน ก็ very good ไปเลย ถือว่าเสร็จสิ้นภารกิจการเตรียมฐานข้อมูล

กลับมาเตรียม code เพื่อเชื่อมต่อฐานข้อมูล

ถ้าใช้ Lumen ตอน install จะเห็นได้ว่ามี file ที่มีชื่อว่า .env เพื่อใช้ setting ข้อมูลที่เราต้องการเชื่อมต่อกับฐานข้อมูล ซึ่งสิ่งที่เราต้องเปลี่ยนแปลงข้อมูลใน file .env หลักก็คือ

DB_DATABASE : ชื่อของ Database เราจะใช้ชื่อที่เราสร้างเมื่อกี Lumen_api

DB_USERNAME : เป็น username ที่ใช้เชื่อมฐานข้อมูลของ xampp root

DB_PASSWORD : password ของ xampp ส่วนมากจะเป็นค่า ว่าง

เรียบร้อยเสร็จสิ้นการเชื่อมต่อข้อมูล

Config ฐานข้อมูลใน Lumen

เมื่อเราเชื่อมต่อข้อมูลเรียบร้อยแล้วสิ่งที่แนะนำให้เรา config database ด้วยนี้แค่แนะนำนะ หรือบ่างเครื่องจะข้ามขึ้นตอนนนี้ได้เลยแต่เครื่องผมมันบังคับให้ทำ เศร้าจริง เราจะไปทำการสร้าง file database.php ใน config/database.php

เปิด withFacades กับ withEloquent ก่อนอย่าลืม

สิ่งที่จะลืมไม่ได้เราต้องเข้าไป comment ใน bootstrap/app.php โดยที่เราจะเปิด comment 2 ตัวคือ หากันเองเดอ

$app->withFacades();$app->withEloquent();

ไปสร้าง Model เพื่อที่จะใช้เรียก database

จะทำการไปสร้าง file ที่มีชื่อว่า User.php ใน app/User.php จากนั้นเอา code นี้ไปแปะได้เลย

ซึ่งสิ่งที่เราต้องรู้จะมี 4 ตัวแปล ก็คือ $table เป็นตัวแปลที่เก็บชื่อ table ที่เป็นของ Model นี้ $fillable เป็นข้อมูล field ที่ต้องการให้แสดงออกมาใช้ใน API ได้ $hidden เป็น field ที่เราจะทำการซ่อนไม่ให้แสดงออกทาง API และ ตัวแปลสุดท้าย $timestamps ประกาศเป็น false คือจะไม่ใช้ timestamps ใน table นี้เพราะถ้าไม่ประกาศ Api ต้องดึงข้อมูล timestamps มาใช้งานด้วย

ไปทำการทำ GetAll โดยดึงข้อมูลจากฐานข้อมูลกันเลย 😃 😃 😃

โดยเราจะกลับไปแก้ไข function getAll() ใน app/Http/Controller/UserController.php โดย code จะได้ประมาณนี้

โดยจะทำการ add Model ที่เราได้สร้างเมื่อกี่มาก่อนก็คือ use App\User และจากนั้นเราจะมาประกาศดึงข้อมูลจาก ฐานข้อมูลกัน ใน function getAll() ศึกจะไม่ได้ใช้ภาษา Sql นะครับ ใครอยากไปศึกษาเพิ่มเติ่มไปที่นี้ได้เลย

จากนั้นไปที่ postman ของเรากัน

ถ้าออกเหมือนกันแปลว่าทำถูกต้องแล้วจ้า แต่ถ้าใคร error ก็ลองสอบถามมาหรือว่าท่านทำตกหล่นขั้นตอนไหนหรือปล่าวลองตรวจสอบกันดีดี

ดึงข้อมูลมาแค่ เฉพาะแต่ละคนโดยใช้ getID()

สิ่งสำคัญที่เราต้องทำคือไปแก้ไข code ใน function getID() เพื่อให้มันดึงข้อมูลจากฐานข้อมูลได้ โดยผมจะทำการแก้ไข

public function getID($id){   $data = User::where(‘id’, $id)->first();
return $this->responseSuccess($data);
}

เสร็จเรียบเราก็ไปทำการ test ที่ program postman ได้เลย

ถ้าทำถูกต้องจะขึ้นแบบนี้ จะเห็นได้ว่าเรากรอก path id ใน link เป็น 1 แล้ว ข้อมูลที่แสดงเป็น 1 เพียงแค่ข้อมูลเดียวแปลว่าเราทำถูกต้องเรียบร้อย

เพิ่มข้อมูลลงฐานข้อมูล โดยใช้ Function addData()

โดยการเพิ่มข้อมูลนั้นเราจะทำการเพิ่มโดย Request ข้อมูลผ่าน postman มาใช้ ข้างใน code ของเรา โดยเราต้องประกาศให้ code เราสามารถใช้ Request ให้ได้โดยประกาศ use Illuminate\Http\Request; เสร็จสิ้นก็ไปทำการแก้ไข function addData กันเลย

จะทำการแก้ไข function addData ใหม่โดยการให้มันสามารถรับ request ได้ โดยจะประกาศข้างในเลย addData(Request $request) จากนั้นก็เรียก class User มาเพื่อเพิ่ม โดยจะทำการเพิ่มข้อมูล 3 ค่าก็คือ

$data->name = $request->name;$data->age = $request->age;$data->tel = $request->tel;

$data->name ทำการรับ $request ที่มีชื่อว่า name ที่ส่งมา

$data->age ทำการรับ $request ที่มีชื่อว่า age ที่ส่งมา

$data->tel ทำการรับ $request ที่มีชื่อว่า tel ที่ส่งมา

step สุดท้าย ก็คือ $data->save() จะใช้เป็นเงื่อนไขใน if(){} ไว้ถ้า save ถูกต้องจะให้มันทำการ return ค่าออกมานั้นเอง ไป test postman กันว่าใช้งานได้หรือไม่

เราต้อง method route เราเป็น post เราก็ต้องส่งข้อมูลไปเป็น post ด้วยนะ แล้วก็เอา link มาใส่เหมือนเดิมแต่สำคัญมากเราต้องใส่ข้อมูลที่จะต้องการส่งไปด้วย โดยเข้า เมนู BODY ผมจะส่งแบบ raw แล้วไปตั้งค่า type เป็น JSON(application/json) และก็ตาม format ที่ผมทำไว้เลย

{
“name”:”Earth”,
“age”:24,
“tel”:”0884328473"
}

ส่งแล้วไปดูค่าค้างล่างจะแสดงข้อมูล success แปลว่าข้อมูลเราส่งเรียบร้อย Very good 👍 👍 👍 👍

แก้ไขข้อมูลเมื่อประกาศผิด โดยใช้ updateData()

ใน function นี้จะเป็นการผสมผสานระหว่าง add ข้อมูล และ getID มารวมกันเพราะเรารู้ว่า เวลาเราแก้ไขเราต้องส่งข้อมูลไปแก้ไขด้วยใช้ไหม แต่สำคัญอีกอย่างก็ต้องมีดัชนีชี้ไปว่าเราจะไปแก้ไขข้อมูลตัวไหนด้วย ก็เลยจะเอา 2 function นี้มาประยุกต์รวมกันเป็น

public function updateData(Request $request, $id){   $data = User::where(‘id’, $id)->first();
$data->name = $request->name;
$data->age = $request->age;
$data->tel = $request->tel;
if ($data->save()) {
return $this->responseSuccess($data);
}
}

เรียบร้อยเราก็ไป test ด้วย program postman เหมือนเดิม

เราจะทำการเปลี่ยน method ที่ต้องการส่งไป เป็น put และ link ที่เราได้ประกาศ route เหมือนเดิม จากนั้นเราก็เพิ่มเมนู body ให้เหมือน add แล้วกด sent ดูครับ ถ้าขึ้น success แปลว่าทำถูกลองไป check ใน getAll ดู

จะเห็นว่า getAll เราจะมีข้อมูลเพิ่มมา 1 ข้อมูลที่ตอนเราเพิ่มไปเมื่อกี้ และ ข้อมูลของ id 1 เราได้เปลียนจาก sutthipong เป็น Mos เรียบร้อย 👍 👍 👍 👍👍 👍 👍 👍👍

function สุดท้ายและท้ายสุด คือ deleteData()

function นี้เราจะทำคล้ายกับ getID เลยแต่เพียงแค่ข้อมูลที่เรียกฐานข้อมูลจะไม่เหมือนกัน เพราะ delete ที่เราจะใช้นี้จะไปทำการ ลบข้อมูลจากฐานข้อมูลออกนั้นเองโดย code จาก function deleteData ของเราจะได้ประมาณนี้เลย

public function deleteData($id){   $data = User::where(‘id’, $id)->delete();
return $this->responseSuccess($data);
}

step ต่อไป test postman. เหมือนเช่นเคย

เราก็ทำการเปลี่ยน method ในการส่งเป็น delete และก็เปลี่ยน path url เป็น deleteData/ { id ที่เราจะลบ } กด sent ไปเลยถ้าขึ้น success ลองกลับไปที่ getAll ของเราดู

จะเห็นได้ว่า id 2 ที่เราสร้างมันขึ้นมาหายไปไหนแล้ว เพราะเราลบมันออกไปแล้วนั้นเอง เรียบร้อยกับการทำ API

ของแถม

api ของเราจะไม่สามารถเอาไปใช้ได้เลยถ้าเราไม่เปิด Allow origin และ method ซึ่งถ้าใครเขียน backend ต้องรู้ดีว่าต้องเปิดก่อน frontend ถึงจะไปดึงได้นะจ๊ะ

เราจะไปทำการสร้าง file ที่มี ผู้ว่า (เห้ย ชื่อว่า) CorsMiddleware.php ใน folder app/Http/Middleware แล้วก็จัด code ชุดนี้ไปเลยท่านๆ

มา อธิบาย code กันพอหอมปากหอมคอ ก็คือ ผมจะทำการ ตรวจสอบ method ที่เป็น options ก่อน ว่ามีไหม ถ้ามี ให้ reponse เป็น status 200 แต่ถ้าไม่เป็น ให้ทำงานต่อไป และก็มาเปิด header สำคัญๆ ทั้งหมดที่เราควรจะมีมาใส่ไว้ จากนั้น save

แล้วก็ไปเรียกใช้ที่ bootstrap/app.php จะไปทำการ เปิด middleware ที่ comment ไว้แล้วเอา class เราไปใส่ หรือจะเอา code ของผมไปทับ middleware เดิมก็ได้

$app->middleware([
App\Http\Middleware\CorsMiddleware::class,
]);

กด save ก็เสร็จสิ้นภารกิจการทำ resful api เรียบร้อย ยะฮู้ๆๆๆ ที่เหลือก็อาศัยการเรียนรู้ของกันต่อ

ขอให้ทุกท่านสนุกกับการเรียนรู้และเขียน code ให้คีย์บอร์ดพัง ^_^

--

--

Sutthipong Nuanma
Amiearth

โปรแกรมเมอร์คนนึงในจังหวัดพะเยา