เนื้อหานี้จะมาแนะนำ Slim ซึ่งเป็น PHP framework ขนาดเล็ก
ที่จะช่วยพัฒนาเว็บแอพลิเคชั่นและ API ได้อย่างง่ายและมี
ประสิทธิภาพ เนื้อหานี้จะไม่ได้ลงรายละเอียดอะไรมากนัก เป็นเพียง
แนวทางการติดตั่งและใช้งานเบื้องต้น หลักๆ การทำงานของ slim ก็คือ
การรับคอยรับ HTTP request ที่ส่งเข้ามา แล้วกำหนดรูปแบบการจัดการ
การทำงานของจากนั้นก็ส่งค่า HTTP response กลับออกมาแสดง
ถ้าใครได้ดูเนื้อหาเกี่ยวกับ NodeJs หรือการใช้งานเกี่ยวกับ HTTP Request
Response ก็น่าจะคุ้ยเคยกับรูปแบบการทำงานลักษณะนี้ดี
Slim เหมาะสำหรับนำมาใช้ในการพัฒนา API เพื่อจัดการกับข้อมูลเพื่อใช้งาน
ร่วมกับการพัฒนาอื่นๆ ที่สำคัญก็คือ slim เขียนโค้ดน้อยและทำงานได้เร็ว
การติดตั้ง Slim framework 4
สมมติเราต้องการติดตั้ง slim มาใช้สร้าง api ให้กับเว็บเดิมที่เรามีอยู่แล้ว ในที่นี้เราจะจำลองที่
เครื่อง local เว็บไซต์โปรเจ็คของเราอยู่ในโฟลเดอร์ demo และเราจะสร้างโฟลเดอร์ api สำหรับ
ใช้งาน slim framework จะได้ path ดังนี้
C: xampp > htdocs > demo > api
ติดตั้ง Slim framework 4 ด้วย Composer
composer require slim/slim:"4.*"
ติดตั้งตัวจัดการร่วมกับ PSR-7 ในที่นี้เราเลือกใช้ Slim PSR-7
composer require slim/psr7
PSR-7 คือรูปแบบการจัดการเกี่ยวกับ HTTP ที่กำหนดให้ใช้งานในลักษณะเดียวกัน หรือก็คือ
HTTP message interfaces ที่กำหนดหน้าตาและการใช้งานให้ไปในทิศทางเดียวกันหรือเหมือนกัน
การใช้งาน Slim framework 4 เบื้องต้น
ต่อไปสร้างไฟล์ 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(); // กำหนด BasePath $app->setBasePath('/demo/api/index.php'); // กำหนด Routing $app->get('/', function (Request $request, Response $response, $args) { $response->getBody()->write("Hello world!"); return $response; }); $app->run();
คำสั่งการทำงานข้างต้นคือ เราต้องการให้เรียกไปยัง url ตามที่กำหนด routing เป็น
https://localhost/demo/api/index.php/
แล้วแสดงข้อความว่า Hello world! สังเกตว่า ถ้าเราไม่กำหนด BasePath จะเกิด error ขึ้น เพราะ
จะไม่สามารถระบุตำแหน่งของ route ได้ถูกต้อง
สมมติว่าเราติดตั้ง slim ไว้ใน root ของ server หรือก็คือใน htdocs เราก็ไม่ต้องกำหนด BasePath
ก็ได้ เพราะเมื่อเราเข้าไปยังหน้า https://localhost/ ก็จะหมายถึง https://localhost/index.php
แต่ข้างต้นเราสร้างไว้ในโฟลเดอร์ย่อยอีกที จึงต้องกำหนด path ให้ถูกต้อง
เราลองเพิ่มส่วนของ route เข้าไปสมมติเป็นหน้า wellcome ดังนี้
$app->get('/home', function (Request $request, Response $response, $args) { $response->getBody()->write("Welcome!"); return $response; });
เมื่อเรียกใช้งานก็จะได้เป็น ดังนี้
ตอนนี้เรามี route อยู่สองอันคือ
https://localhost/demo/api/index.php/ https://localhost/demo/api/index.php/home
ถ้าสมมติเราเรียกไปยัง route ที่ไม่ได้กำหนดไว้ เช่น /contact ก็จะขึ้น error ขึ้นดังรูป
เป็น HttpNotFoundException หรือก็คือไม่พบหน้าที่กำลังเรียกดู และเนื่องจากเรายังไม่ได้
จัดการ error จึงแสดงรูปแบบดังกล่าว ให้เราเพิ่มการจัดการ error เบื้องต้น เข้าไปดังนี้
$app->addErrorMiddleware(true, true, true);
กำหนดไว้ก่อนการกำหนด routing ตัวค่า boolean ทั้ง 3 เป็น parameter ของค่า displayErrorDetails
logErrors และ logErrorDetails โดยตัวแรกเป็นการกำหนดให้แสดงรายละเอียดของ error หรือไม่
อีกสองอัน จะเป็นการกำหนดในส่วนของ log ไฟล์ที่จะให้บันทึก หรือไม่
ดูหน้าตาที่เปลี่ยนไป กรณีไม่เจอ route ที่กำหนด
และเราลองเปลี่ยนค่าแรกเป็น false
$app->addErrorMiddleware(false, true, true);
ก็จะแสดงเฉพาะข้อความตามรูป และไม่แสดงรายละเอียด error
สังเกตว่าเวลาเราเรียกใช้งานผ่าน url จะมีชื่อไฟล์ index.php ด้วย เราต้องการตัดออกไป ก็สามารถ
กำหนดในไฟล์ .htaccess ได้ดังนี้
ไฟล์ .htaccess
RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php [QSA,L]
เราลองเรียกไปยังหน้า /home เป็นดังนี้ดู
เกิด 404 error หา route ไม่เจอ ก็เพราะว่าเราต้องไปแก้ไข basePath ให้ถูกต้องก่อนดังนี้
// เดิม $app->setBasePath('/demo/api/index.php'); $app->setBasePath('/demo/api');
ทั้งนี้การกำหนด path ต้องให้สอดรับกับ url ที่เรียกใช้งาน จะเห็นว่า หลังคำว่า api เราไม่ต้อง
กำหนด / เข้าไป เพราะอยู่ในส่วนของการกำหนด routing แล้ว เวลาเรียกใช้ ก็จะได้ route เป็น
https://localhost/demo/api/home
ผลลัพธ์ก็จะแสดงถูกต้องดังรูป
ไฟล์ 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();
เนื้อหานี้เป็นเนื้อหาเบื้องต้น ให้เราพร้อมสำหรับการใช้งาน slim framework รอเนื้อหาเกี่ยวกับ slim ใน
บทความต่อไป