มาเริ่มเรียนรู้ Lumen ไปด้วยกันดีกว่า
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
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 ให้คีย์บอร์ดพัง ^_^