จากตอนที่แล้วเราได้รู้จักการติดตั้งและใช้งาน
slim framework เบื้องต้นไปแล้ว เนื้อหานี้เราจะมาดูเกี่ยวกับ
Application Life Cycle หรือเข้าใจอย่างง่ายก็คือลำดับกระบวน
หรือวงจรการทำงานของโปรแกรม ทบทวนตอนที่แล้วได้ที่บทความ
การติดตั้งและใช้งาน Slim framework 4 เบื้องต้น http://niik.in/1051
https://www.ninenik.com/content.php?arti_id=1051 via @ninenik
วงจรกระบวนการทำงานของ Slim Framework
เราจะใช้ตัวอย่างจากตอนที่แล้วมาประกอบการอธิบาย และอาจจะเพิ่มเติมเนื้อหา
บางส่วนที่เกี่ยวข้องเพิ่มเข้าไป เพื่ออธิบายเพิ่มเติม
ไฟล์ index.php
<?php use Psr\Http\Message\ResponseInterface as Response; use Psr\Http\Message\ServerRequestInterface as Request; use Slim\Factory\AppFactory; require './vendor/autoload.php'; // กำหนด slim instance app $app = AppFactory::create(); // กำหนด path $app->setBasePath('/demo/api'); // กำหนดการจัดการเกี่่ยวกับ error $app->addErrorMiddleware(false, true, true); // กำหนด Routing $app->get('/', function (Request $request, Response $response, $args) { $response->getBody()->write("Hello world!"); return $response; }); $app->get('/home', function (Request $request, Response $response, $args) { $response->getBody()->write("Welcome!"); return $response; }); $app->run();
1. สร้าง Slim Instantiation
หรือก็คือการกำหนดตัวแปรสำหรับอ้างอิง Slim object ด้วยคำสั่ง
$app = AppFactory::create();
ตัวแปร $app คือตัว instance ที่เราจะอ้างอิงและใช้งาน slim object
2. กำหนด Route
// กำหนด Routing $app->get('/', function (Request $request, Response $response, $args) { $response->getBody()->write("Hello world!"); return $response; }); $app->get('/home', function (Request $request, Response $response, $args) { $response->getBody()->write("Welcome!"); return $response; });
ทำการกำหนด route เข้าใจอย่างง่ายก็คือ url path ที่จะอ้างอิงหน้าต่างๆ โดยใช้งาน
method หรือฟังก์ชั่นเกี่ยวกับการกำหนด route ได้แก่ get(), post(), put(), delete(), patch(),
head(), และ options() เป็นต้น ในตัวอย่างเรากำหนดโดยใช้ get() อย่างเดียว
ในแต่ละ method ก็รองรับรูปแบบการ request เข้ามา เช่น get() รองรับการ request เพื่อ
อ่านข้อมูลไปแสดงเป็นหลัก ตัวอย่างเรากำหนด route ไว้สองอัน จำลองการเรียกไปยังหน้า
route path เป็น / และ /home
3. โปรแกรมเริ่มทำงาน
ส่วนสุดท้ายก็คือสั่งตัวโปรแกรมเริ่มทำงานด้วยคำสั่ง run() เมื่อโปรแกรมเริ่มทำงาน ก็จะเริ่ม
กระบวนการทำงานตามขั้นตอนต่างๆ ตั้งแต่ เมื่อเริ่มมี HTTP Request และเข้าสู่ชั้นการทำงานของ
Middleware (ถ้ามี) โดยจะเริ่มจาก middleware ที่เพิ่มเข้าไปล่าสุด เป็นการจัดการในส่วนของ
request object ทำงานไปเรื่อยๆตามจำนวนที่มี ไปจนจบที่ส่วนของ slim app หรือส่วนของ route
ซึ่งเป็นใจกลางการทำงาน เมื่อ route ทำการ กระจาย response object
กลับออกมาก็จะผ่าน middleware จากด้านใน (middleware ที่เพิ่มก่อน) ออกไปจนถึง
middleware ตัวล่าสุด จากนั้นส่งออกเป็น HTTP response ดูการจำลองจากโค้ดด้านล่าง
// middleware ตัวที่เพิ่มก่อน จะเป็นตัวในสุด $app->add(function (Request $request, RequestHandler $handler) use ($app) { echo "B"; $response = $handler->handle($request); $existingContent = (string) $response->getBody(); $response = $app->getResponseFactory()->createResponse(); $response->getBody()->write('BEFORE ' . $existingContent); echo "BB"; return $response; }); // middleware ตัวที่เพิ่มต่อมา จะเป็นตัวล้อมออกมาวงนอกไปเรื่อยๆ $app->add(function (Request $request, RequestHandler $handler) { echo "C"; $response = $handler->handle($request); $response->getBody()->write(' AFTER'); echo "CC"; return $response; }); // ตัว route เป็น slim app อยู่ด้านในตรงกลาง $app->get('/', function (Request $request, Response $response, $args) { echo "A"; $response->getBody()->write('Hello World'); echo "AA"; return $response; });
ลำดับการทำงานก็คือ
เริ่มจากส่วนของการ request จาก C > B > A
ส่วนของการ response จาก AA > BB > CC
ภาพรวม C > B > A > AA > BB > CC
ข้อความผลลัพธ์ของ response จากโค้ดข้างต้น จะได้ข้อความเป็น 'BEFORE Hello World AFTER'
การใช้งาน Request และ Response object
ตัว Request และ Response object จะเป็น object ที่ไม่สามารถแก้ไขได้ หรือที่เรียกว่า immutable
value แต่สามารถเปลี่ยนแปลงค่าด้วยวิธีการ clone ขึ้นมาแล้วปรับแต่งเฉพาะค่าที่ต้องการ ปกติจะเป็น
method ที่ขึ้นต้นด้วยคำว่า with เช่น withHeader() ตัวอย่างเช่น
$app->get('/json', function (Request $request, Response $response, array $args) { $payload = json_encode(['hello' => 'world'], JSON_PRETTY_PRINT); $response->getBody()->write($payload); return $response->withHeader('Content-Type', 'application/json'); });
ผลลัพธ์ที่ได้
ตัว respone ที่ได้จะเป็นตัวที่ clone มาใหม่และมีการปรับค่า header ตามกำหนด
เราสามารถสร้าง response object ใหม่ได้ดังนี้
$app->get('/json', function (Request $request, Response $response, array $args) use ($app) { $responseNew = $app->getResponseFactory()->createResponse(); });
คำสั่งสำหรับ clone หรือปรับค่าใหม่ให้กับ Request และ Response object มีดังนี้
คำสั่งที่ใช้ได้ทั้ง Request และ Response
withProtocolVersion($version) withHeader($name, $value) withAddedHeader($name, $value) withoutHeader($name) withBody(StreamInterface $body)
คำสั่งสำหรับ Request อย่างเดียว
withMethod($method) withUri(UriInterface $uri, $preserveHost = false) withCookieParams(array $cookies) withQueryParams(array $query) withUploadedFiles(array $uploadedFiles) withParsedBody($data) withAttribute($name, $value) withoutAttribute($name)
คำสั่งสำหรับ Response อย่างเดียว
withStatus($code, $reasonPhrase = '')
เนื้อหาตอนหน้าจะมาดูต่อเกี่ยวกับการใช้งาน Middleware ใน Slim framework เพิ่มเติม