มาเริ่มเรียนรู้ Lumen ไปด้วยกันดีกว่า

Sutthipong Nuanma
Amiearth
Published in
6 min readMar 5, 2019

Lumen เป็นภาษาที่น่าสนใจมาก เพราะเป็นภาษาที่ทำ Api ได้ง่ายมาก เพราะ Lumen มันถอดบ่างส่วนของ Laravel ที่เฉพาะทางด้าน Api ออกมาทำให้มันทำงานได้เร็วขึ้นเฉพาะเจาะจงมากขึ้น ซึ่งถ้าใครพอมีความรู้ภาษา Laravel มาจะดีมากแต่ถ้าไม่มีกะไม่เป็นไรเดียวเรามาเริ่มศึกษาด้วยกันเลย

ก่อนอื่นที่เราจะใช้ Lumen เราต้องทำการติดตั้ง ตัว Composer กันก่อนเพื่อนใช้สำหรับติดตั้ง Lumen Composer คือส่วนที่ไว้สำหรับติดตั้ง Packet หรือ Library ของ Php คล้ายๆ กับพวก npm ใน nodejs หรือ pip ของ python นั้งเอง

ติดตั้งตามเว็บไซต์ที่แนบไว้เลย ส่วนใครที่ติดตั้งแล้ว ลองเข้าไปใน Command line สำหรับผู้ใช้ Windown หรือ ถ้าใครใช้ Mac หรือ Linux เข้าไป Terminal แล้วของพิมพ์ conposer ถ้าแสดงคำว่า composer และ version แปลว่าท่านทำถูกแล้ว

เริ่มติดตั้ง Lumen กันเลย

ถ้าใครติดตั้งคำสั่งไม่ได้ให้กลับไปดู Blog ที่ผมแปะไว้ข้างบนนะครับ

ทำการติดตั้ง Lumen ลงไปในเครื่องหลังจากเราได้ทำการติดตั้ง composer ไปแล้ว

composer global require "laravel/lumen-installer"

เอาไปใส่ใน xampp นะครับ โดยถ้ายังไม่ได้ติดตั้งก็ไปติดตั้งก่อนเลย เพราะ Lumen เป็น Framework ของ php เลย run on apache แต่ถ้าเราจติดตั้งแค่ apache อย่างหน้าจะ set ยากเลยแนะนำให้เพื่อนโหลด โปรแกรม xampp มาใช้ แล้วชีวิตจะสดใสขึ้น

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

เมื่อติดตั้งเสร็จเรียบร้อยกลับมา start ตามรูปด้วยนะครับ

การนั้นเข้าไปที่ CMD ใน windown แล้ว พิมพ์ cd C:\xampp\htdocs เพื่อเข้าไปหน้า file ที่เก็บ โปรแกรม xampp

จากนั้นก็ทำกการติดตั้งได้เลย

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

โครงสร้าง File Lumen

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

ลองตรวจสอบว่า Project สร้างได้ไหม

http://localhost:/ชื่อ project ที่เราสร้าง/public/

จะแสดง Version ของ Lumen ขึ้นมา

นี้คือได้เรียบร้อย

มาเรียนรู้การใช้ route

route lumen จะอยู่ใน Folder route/web.php ลองเปิดกันดูจะเห็นการใช้ route เพื่อแสดง path version Lumen ของเรา

Basic route

$router->get(‘foo’, function () { 
return ‘Hello World’;
});

ลอง Copy ไปใส่ใน route/web.php ดู แล้วก็ลองพิมพ์ path นี้ใน Browser ของท่านดูครับ http://localhost/CRUDLumen/public/foo หน้าจอของท่านจะแสดง ข้อความ hello world ตามที่เราต้องการให้ return แสดง ซึ่ง route มีได้หลากหลายประเภทมาก

$router->get($uri, $callback); 
$router->post($uri, $callback);
$router->put($uri, $callback);
$router->patch($uri, $callback);
$router->delete($uri, $callback);
$router->options($uri, $callback);

Route Parameters

$router->get('user/{id}', function ($id) { 
return 'User '.$id;
});

สิ่งที่เราให้ความสำคัญ การประกาศตัวแปลผ่าน url โดย เราจะเขียน {id} ไว้ข้างใน path แล้วดึงตัวแปลผ่าน function $id จากนั้นท่านก็สามารถดึงตัวแปลนั้นมาลองใช้งานได้เลย http://localhost/CRUDLumen/public/user/11 ลองเปลี่ยนจาก 11 เป็นข้อความอื่นดูจะเห็นได้ว่า ตัวแปล $id ถูกรับมาจาก url ได้เลย

Route Groups

ตัว Route Groups นี้ผมจะขอพูดถึง สองตัวที่ผมเอามาใช้งานจริงๆ Middleware และ Prefixes

  • Middleware

เป็นส่วนที่จัดไว้ให้สำหรับ login ก่อนเท่านั้นถึงจะใช้ route ข้างใน Group นี้ได้

$router->group(['middleware' => 'auth'], function () use ($router) {

$router->get('/', function () {
// Uses Auth Middleware
});
$router->get('user/profile', function () {
// Uses Auth Middleware
});
});
  • Prefixes

เป็นการนำหน้าชื่อ path ใน link ที่เอามาใช้

$router->group(['prefix' => 'api/v1'], function () use ($router) { 

$router->get('users/{id}', function () {
return 'User '.$id;
});
});

ลองพิมพ์ http://localhost/CRUDLumen/public/api/v1/user/66 จะเห็นได้ว่าสิ่งที่เราจะพิมพ์เพิ่มไปใน link ก็คือ api/v1 เพื่อให้เราจัดกลุ่ม API ได้ง่ายขึ้น

เข้าใจเรื่อง Middleware

ขอบคุณภาพจาก arnondora.in.th

Middleware เป็นตัวกรองเมื่อเวลาเรา request มาแล้ว authen เพื่อเข้าใช้งานระบบ ซึ่งถ้าเป็น Laravel เวลาเราติดตั้ง Project จะมีการสร้าง middleware แบบย่อยๆ ให้เราใช้

การกำหนด Middleware

เราจะสร้าง middleware ชื่อ file ว่า ExampleMiddleware จากตัวอย่างเราจะทำการ check request ค่า age ว่ามีค่าน้อยกว่าหรือเท่ากับ 200 ให้ redirect ไปหน้า url home

<?php

namespace App\Http\Middleware;

use Closure;

class OldMiddleware
{
/**
* Run the request filter.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->input('age') <= 200) {
return redirect('home');
}

return $next($request);
}

}

Registering Middleware

Global Middleware

ถ้าเราอยากเรียกใช้ middleware ผ่าน request ที่ class ที่เราสร้าง นำ path ตำแหน่ง class ที่เราสร้างมาวางไว่ใน [] ข้างใน function$app->middleware() ที่ไฟร์ bootstrap/app.php ได้เลย ซึ่ง bootstrap ในที่นี้ไม่ใช้ bootstrap Framwork นะ

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

Assigning Middleware To Routes

เป็นการสร้าง keyword ให้ middleware ที่ใช้สำหรับไปเรียกใช้ผ่าน route

$app->routeMiddleware([
'auth' => App\Http\Middleware\OldMiddleware::class,
]);

โดยเราจะสร้าง keyword ไว้แล้วไปเรียนใช้ใน routes/web.php

$router->get('admin/profile', ['middleware' => 'auth', function () {
//
}]);

เรียกใช้หลายๆ middleware

$router->get('/', ['middleware' => ['first', 'second'], function () {
//
}]);

ผมจะขออธิบาย ถึงแค่นี้เพราะเชื่อว่าถ้าศึกษามากถึงขนาดนี้คงศึกษาเพิ่มเติ่มกันได้ เพราะตอนผมทำ project ขึ้นมาผมก็ใช้ ประมาณนี้แหละ สำหรับใครอยากศึกษาเพิ่มเดียวแปะ like ไว้

Controllers ส่วนสำคัญที่คุณควรรู้

ตัวนนี้จะมาช้วยทำให้ชีวิตของท่านอยู่ดีกินดีขึ้น เพราะแทนทีเวลาเราจะเอา code ทั้งหมดที่เราจะเขียนลงไปไว้ใน routes/web.php อย่างเดียว เราก็เปลี่ยนเป็นเอาไปยัดใส่ Controllers แล้ว routes มาเรียกใช้อีกที 😮😮😮😮😮😮😮😮😮😮

ทำการไปสร้างไฟร์ UserController.php ที่ตำแหน่งapp/Http/Controllers

<?php

namespace App\Http\Controllers;

use App\User;

class UserController extends Controller
{
/**
* Retrieve the user for the given ID.
*
* @param int $id
* @return Response
*/
public function show()
{
return "hello";
}
}

เมื่อเราประกาศแบบนี้แล้วเราก็สามารถเรียกใช้ได้เลย

$router->get('user', 'UserController@show');

รับ Parameters มาใช้ใน Controllers ยังไง

ก่อนหน้านี้เราได้ลองรับ Parameters ผ่าน route ไปแล้ว แนะลืมแล้วสิ กลับไปดูได้เลยอยู่ข้างบน แต่สงสัยว่าเราจะเอามาใช้ยังไง ใช้ไหม

<?php

namespace App\Http\Controllers;

use App\User;

class UserController extends Controller
{
/**
* Retrieve the user for the given ID.
*
* @param int $id
* @return Response
*/
public function show($id)
{
return $id;
}
}

กลับไปแก้ไข file UserController.php ที่เราเคยสร้าง ให้เพิ่ม $id ที่ show แล้วเราจะลอง return ว่าใช้งานได้ไหม และก็อย่าลืมไป แก้ไข route ด้วยละ

$router->get('user/{id}', 'UserController@show');

เข้าใจ Request กับ Responses แบบ คร่าว

ถ้าแปลตรงตัว Request => คำร้อง , Response => คำตอบ พอรู้ความหมายและภาพข้างบนก็พออาจจะพอรู้คำตอบบ่างแล้ว ซึ่งสมมุติ Browser คือเครื่องคอมพิวเตอร์ของเรา เมื่อเราทำการ login Browser ก็จะทำ ส่งข้อมูลที่เรากรอกไป (Request ) เพื่อร้องขอข้อมูลกลับ ซึ่ง Server ก็ทำการรับคำร้องแล้วก็เข้าสู่กระบวนการที่ Function ที่เขียนไว้ จากนั้นเมื่อเสร็จสิ้น ก็ทำการส่งคำตอบที่เราต้องการมา (Response) โดยส่งผ่าน internet ยกเว้นเราจะใช้ Server จำรองพวก xampp ก็ไม่จำเป็นต้องใช้ internet ก็ได้

Request

เมื่อกี่เราพูดถึงการทำงานของมันไปแล้วเรามาใช้มันกัน ก่อนอื่นต้องเอาตัวนนี้มาแปะไว้ใจ code เราก่อน use Illuminate\Http\Request;

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
/**
* Store a new user.
*
* @param Request $request
* @return Response
*/
public function addData(Request $request)
{
$name = $request->input('name');

return $name;
}
}

โดยการ request ผ่าน postman ให้ไม่เคยใช้ ลองอ่านในนี้ได้

ทำการเรียกใช้ route โดยเอา codeไป แปะ routes/web.php

$router->post('addData', 'UserController@addData');

สิ่งที่เราควร set อย่างแรกคือ url | เปลี่ยน เป็น post | Body เลือก raw เลือก type เป็น json แล้วใส่ข้อมูลตามภาพ จากนั้นดูล่างสุดจะแสดง ข้อมูลที่เรากรอกออกมา

Responses

ตัวนี้เราจะข้ามที่จะอธิบายความหมายไปเลย จะไปพูดถึงการใช้งานของมันเลยละกัน Responses ตัวนี้จะเห็นได้ว่าผมใช้แสดงตัวอย่างแทบทุกอันเลยนั้นก็คือ return

$router->get('/', function () {
return 'Hello World';
});

แต่ใน Lumen สามารถทำอะไรได้มากว่าที่เราคิด สำหรับถ้าเราจะให้มันใช้ response จริงของ Lumen ได้เราต้อง ประกาศ use Illuminate\Http\Response; ไปเรียกใช้งาน response มาใช้ใน code

use Illuminate\Http\Response;

$router->get('home', function () {
return (new Response($content, $status))
->header('Content-Type', $value);
});

หรืออาจจะใช้คำสั่ง response แบบนี้ก็ได้

$router->get('home', function () {
return response($content, $status)
->header('Content-Type', $value);
});

การประกาศใช้ header และ json

return response()->json(["status" => "success", "data" => $name], 200)
->header("Access-Control-Allow-Origin", "*")
->header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");

ก่อนอื่นเราประกาศการใช้ respone ที่ทำให้รูปแบบ เป็น json โดยใช้คำสั่ง

response()->json() เพื่อให้จัดกลุ่มข้อมูลในการตอบกลับ User

["status" => "success", "data" => $name] เป็นข้อมูลที่ต้องการแสดงให้ browser ของเรานำไปใช้ต่อ

200 เป็น status response ที่บอกว่าการส่งของเราสำเร็จ ซึ่ง status นี้แต่ละเลขก็จะมีความหมายแตกตางกันไป ลองอ่านๆ เพิ่มเติมกันดูครับ ✌️✌️✌️

header("Access-Control-Allow-Origin", "*") กำหนด Origin ที่อนุญาตให้ใช้ Resource ร่วมกันได้

header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS"); กำหนด Methods ที่อนุญาตให้ใช้ในการติดต่อได้

และเพิ่มเติม

Access-Control-Allow-Headers กำหนด Headers ที่อนุญาตให้ใช้ในการติดต่อได้

Access-Control-Max-Age กำหนด เวลาในการติดต่อ (86400 = 24 ช.ม)

ถ้าเราไม่กรอก header เวลา response จะเกิดอะไรขึ้น

มันจะ error ให้กับ browser ที่ดึง api เราไปใช้เราก็ต้องใส่ header ด้วยอย่างลืมกันนะครับ 😬😬😬

สิ่งที่แนะนำให้ศึกษาเพิ่มเติ่ม การทำ resful api ใน ภาษา Lumen

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

--

--

Sutthipong Nuanma
Amiearth

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