กระบวนการทำงาน หรือ Life Cycle ของ Slim Framework

เขียนเมื่อ 3 ปีก่อน โดย Ninenik Narkdee
slim php php framework app life cycle

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ slim php php framework app life cycle

ดูแล้ว 4,404 ครั้ง


จากตอนที่แล้วเราได้รู้จักการติดตั้งและใช้งาน
slim framework เบื้องต้นไปแล้ว เนื้อหานี้เราจะมาดูเกี่ยวกับ
Application Life Cycle หรือเข้าใจอย่างง่ายก็คือลำดับกระบวน
หรือวงจรการทำงานของโปรแกรม ทบทวนตอนที่แล้วได้ที่บทความ
    การติดตั้งและใช้งาน Slim framework 4 เบื้องต้น http://niik.in/1051
 
 

วงจรกระบวนการทำงานของ 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 เพิ่มเติม
 


กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ