การกำหนด และใช้งาน RESTful API ใน CodeIgniter 4

เขียนเมื่อ 3 ปีก่อน โดย Ninenik Narkdee
restful api codeigniter codeigniter 4

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ restful api codeigniter codeigniter 4

ดูแล้ว 5,264 ครั้ง


เนื้อหาต่อไปนี้ เราจะมาดูเกี่ยวกับ RESTful API ใน CI
ซึ่งใน CI4 ทำให้การจัดการเกี่ยวกับ RESTful API ง่าย
และสะดวกขึ้นมาก โดยไม่ต้องเรียกใช้งาน Library จาก
ภายนอกเพิ่มเติมแต่อย่างไร
    หลักๆ ในเนื้อหาตอนนี้ เราจะมาดูเกี่ยวกับภาพรวมกันก่อน ซึ่งตัวอย่าง
การใช้งาน เราจะไปอธิบายในบทความหน้า
    ในเนื้อหา เราจะได้มาทบทวนเกี่ยวกับการใช้งาน Controller และ Routes
สามารถดูเพิ่มเติมได้ที่บทความ
    รู้จักกับ Controller และ Controller Filter ใน CodeIgniter 4 http://niik.in/997 
    ทำความรู้จักกับ URL และ URI Routing ใน CodeIgniter 4 http://niik.in/996 
 
 
 

การกำหนด Resource Routes ให้กับ RESTful API

    โดยทั่วไป ในการใช้งาน RESTful API ของฝั่ง Client ก็มักจะระบุ URL มายัง endpoint ที่ URL ปลายทาง
ที่จะเรียกใช้งาน โดยเรียกใช้ผ่าน HTTP Method ต่างๆ เช่น GET POST PUT DELETE เหล่านี้เป็นต้น ดังนั้น
เวลาเรากำหนด routes ให้กับการเพิ่ม ลบ แก้ไข และแสดงข้อมูล ก็จะมีลักษณะประมาณนี้
 
$routes->post('users',                'Users::create');  // เพิ่ม
$routes->delete('users/(:segment)',   'Users::delete/$1'); // ลบ
$routes->get('users/(:segment)/edit', 'Users::edit/$1'); // แก้ไข
$routes->get('users/(:segment)',      'Users::show/$1'); // แสดงข้อมูล
 
    แต่ใน CI4 เราสามารถเรียกใช้งานการกำหนดแบบ Resource Routes ในรูปแบบดังนี้แทนได้
 
$routes->resource('users');
 
    การกำหนดแค่บรรทัดเดียว จะมีค่า เท่ากับการกำหนดตามรูปแบบด้านล่างทั้งหมด
 
// เท่ากับรูปแบบการกำหนดด้านล่าง:
$routes->get('users/new',             'Users::new'); // แสดงหน้าเพิ่มใหม่
$routes->post('users',                'Users::create'); // เพิ่ม
$routes->get('users',                 'Users::index'); // แสดงหน้ารายการทั้งหมด
$routes->get('users/(:segment)',      'Users::show/$1');  // แสดงหน้ารายละเอียด
$routes->get('users/(:segment)/edit', 'Users::edit/$1');  // แสดงหน้าแก้ไข
$routes->put('users/(:segment)',      'Users::update/$1'); // แก้ไข
$routes->patch('users/(:segment)',    'Users::update/$1'); // แก้ไข
$routes->delete('users/(:segment)',   'Users::delete/$1');  // ลบ
 
    รูปแบบข้างต้น สมมติ Users คือ controller ที่เราเรียกใช้งาน มี method ต่างๆ เช่น new create index show
edit update และ delete   ซึ่งถ้าเราใช้งานแบบ RESTful API เพื่อให้สอดคล้องกับการทำงานของ resource routes
เราต้องกำหนดชื่อ method ต่างๆ ตามที่แสดงด้านบน
    นอกจากการกำหนดข้างต้น จะรองรับการเรียกใช้งานผ่าน HTTP request แล้ว เรายังสามารถประยุกต์กับ HTML
form ได้อีกด้วย อย่างที่ทราบว่า การส่งข้อมูลผ่านฟอร์ม เราจะส่งได้สองแบบคือ GET กับ POST และส่วนใหญ่ก็จะใช้
เป็นแบบ POST ดังนั้น ถ้าเราต้องการให้ สามารถรองรับการใช้งานร่วมกับฟอร์ม เช่น กรณีการ ลบและแก้ไขข้อมูล
ก็สามารถเพิ่ม option เข้าไปดังนี้
 
$routes->resource('users', ['websafe' => 1]);
 
    การกำหนด option ข้างต้น จะทำให้มีรูปแบบ routes เพิ่มเข้ามาอีกสองส่วนคือ
 
$routes->post('users/(:segment)/delete', 'Users::delete/$1');
$routes->post('users/(:segment)',        'Users::update/$1');
 
    จะเห็นว่า ตอนนี้ routes ของ resource ของ api รองรับการส่งข้อมูลจากฟอร์มแบบ POST สำหรับลบและ
แก้ไขข้อมูลได้ด้วย ซึ่งจากเดิม ต้องเรียกผ่าน HTTP method เป็น DELETE แล PUT หรือ PATCH
 
 

    การเปลี่ยน Controller ที่ใช้งานใน Resource Route

    ในการกำหนด resouce routes ข้างต้น โดยทั่วไปแล้ว ตัว Controller จะเป็นชื่อเดียวกันกับชื่อ route อย่างข้างต้น
ชื่อ route คือ users ตัว Controller ก็จะเป็นชื่อ Users ให้โดยอัตโมนัติ  แต่ถ้าเราอยากเปลี่ยนเป็น Controller อื่นที่
ไม่จำเป็นต้องชื่อตามชื่อของ route เราก็สามารถกำหนด option ระบุ resource controller ที่ใช้งานได้ดังนี้
 
$routes->resource('users', ['controller' =>'Account']);
 
    จะมีผลให้ส่วนของ Controller ที่เรียกใช้งานเปลี่ยนไปตามนี้
 
// แสดงบางส่วนเท่านั้น มีผลกับทุก route ที่เกียวข้อง
$routes->get('users', 'Account::index');
 
 

    การเปลี่ยนรูปแบบ Segment ใน Resource Route

    ในการใช้งาน resource routes ตำแหน่ง segment ปกติจะเป็น id หรือค่าของข้อมูลที่เป็น primary key และไม่
ได้กำหนดตายตัวว่าต้องเป็นข้อมูลแบบใด แต่เราสามารถระบุ ชนิดหรือรูปแบบของข้อมูล โดยใช่ placeholder option
เช่น เราต้องการให้ส่วนของ segment เป็นข้อมูลตัวเลขอย่างเดียว ก็สามารถกำหนดเป็นดังนี้
 
$routes->resource('users', ['placeholder' => '(:num)']);
 
    จะมีผลให้ส่วนของ segment เดิม ถูกแทนที่ด้วย รูปแบบใหม่ดังนี้
 
// ค่าเดิม $routes->get('users/(:segment)', 'Users::show/$1');
// แสดงบางส่วนเท่านั้น มีผลกับทุก route ที่เกียวข้อง
$routes->get('users/(:num)', 'Users::show/$1');
 
 

    การจำกัดการสร้าง Routes ใน Resource Route

    อย่างที่เราทราบแล้วว่า การกำหนด resource route จะมีการสร้าง routes ต่างๆ ขึ้นมาให้อัตโนมัติ ตามที่ได้อธิบาย
ไปแล้วด้านบน อย่างไรก็ตาม เราสามารถจำกัดการสร้าง routes เหล่านั้น ให้มีเฉพาะค่าที่ต้องการโดยใช้ option ค่า 
'only' หรือ ให้ยกเว้นเฉพาะค่าที่ต้องการโดยใช้ option ค่า 'except'
    ตามความหมายของค่า option ก็คือ only ก็จะเป็นการกำหนดเอาเฉพาะ method ที่เรากำหนดเท่านั้น ส่วน except ก็
จะเป็นการเอาส่วนที่เหลือทั้งหมด ยกเว้นที่กำหนดใน option ค่านี้ไม่ต้องเอา ประมาณนี้เป็นต้น ดูตัวอย่างการกำหนด
ตามรูปแบบด้านล่าง
 
// กรณีใช้แบบ only 
$routes->resource('users', ['only' => ['index', 'show']]);
// จะมี index และ show

// กรณีใช้แบบ except
$routes->resource('users', ['except' => 'new,edit']);
// จะมี index, show, create, update, new, edit และ delete.
 
 
 

การกำหนด ResourceController ให้กับ RESTful API

    การกำหนด Controller สำหรับใช้งาน RESTful API เราจะต้องกำหนด method ของ controller class ตามค่าที่ได้จาก
การกำหนดอัตโนมัติจาก Resource Routes ที่อธิบายไปแล้วด้านบน สมมติเราแสดงแค่ method เดียว คือ index เราจะได้
ไฟล์ Users.php ดังนี้
 
    app/Controllers/Users.php
 
<?php namespace App\Controllers;
use CodeIgniter\RESTful\ResourceController;  // ใช้งาน ResourceController class
class Users extends ResourceController
{
    protected $modelName = 'App\Models\Users';
    protected $format    = 'json';

    public function index()
    {
        $response = [
            'status'   => 200,
            'error'    => null,
            'messages' => 'test'		
		];
        return $this->respond($response);
    }

    // ...
}
 
    โดยทั่วไป เรามักจะสร้าง Controllers class โดยสืบทอดมาจาก Controller แต่ในกรณีเราใช้งานสำหรับ RESTful 
API เราจะเปลี่ยนมาใช้งาน ResourceController แทน ใน ResourceController จะมีส่วนของการกำหนด property
ของ class ที่ชื่อ $modelName และ $format เป็นการระบุ Model class ที่จะใช้งาน กับรูปแบบข้อมูลที่จะแสดง 
สามารถกำหนดเป็น xml หรือ json ได้ ตัวอย่างข้างต้น เราแสดงเฉพาะ index() method เท่านั้น ให้เห็นเป็นแนวทาง
จำลองการส่งค่าข้อมูลกลับเป็น json string data โดยใช้คำสั่ง $this->respond()
    เวลาใช้งานจริง เราจะต้องกำหนด method ต่างๆ ให้ครบ เราจะได้ดูตัวอย่างทั้งหมดในบทความตอนหน้า
 
    ตัวอย่างข้างต้น เนื่องจาก index() method อยู่ในส่วนของการเรียกใช้งานผ่าน HTTP Get เราสามารถแสดงข้อมูล
โดยเรียกผ่านบราวเซอร์ได้ จะได้ผลลัพธ์ประมาณนี้
 
// https://www.mysslweb.com/users
{
    "status": 200,
    "error": null,
    "messages": "test"
}
 
    หรือจะเรียกใช้งานผ่าน Fetch API ของ JavaScript ประมาณนี้ก็ได้
 
fetch('https://www.mysslweb.com/users')
  .then(response => response.json())
  .then(data => console.log(data));
 
    รูปแบบการกำหนด ResourceController ข้างต้น จะใช้งานกับการกำหนด Resource Routes ในรูปแบบดังนี้
 
$routes->resource('users');
 
    แต่ถ้าเรามีการใช้งานชื่อ routes นี้หลายส่วนซ้ำกัน เช่น ส่วนของ admin หรือส่วนจัดการอื่น เราก็อาจจะกำหนด
โฟลเดอร์ย่อยเข้าไปในรูปแบบดังนี้
 
$routes->resource('api/users');
 
    จากนั้นในส่วนของ ResourceController ไฟล์ Users.php เราก็ย้ายไปไว้ในโฟลเดอร์ Api อีกที เป็น
 
    app/Controllers/Api/Users.php
 
<?php namespace App\Controllers\Api;
use CodeIgniter\RESTful\ResourceController;  // ใช้งาน ResourceController class
class Users extends ResourceController
{

}
 
    ส่วนของ namespace เราเพิ่ม Api โฟลเดอร์เข้าไป เวลาใช้งาน เราก็จะเรียกใช้งานผ่าน URL เป็นดังนี้
 
https://www.mysslweb.com/api/users
 
    เท่านี้เราก็จะสามารถแยกส่วนของ users สำหรับ api ออกมาจากส่วนอื่นได้ เพื่อป้องกันความสัมสน
 
    หลักๆ สำหรับการกำหนดเบื้องต้นก็จะมีแค่นี้ จะเห็นว่าง่ายและสะดวกมาก ในการใช้งาน RESTful API สำหรับ CI4
เนื้อหาตอนหน้าเราจะมาดูตัวอย่างแบบเต็ม การกำหนด method อื่นๆ การใช้งานร่วมกับ model รอติดตาม


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



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









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






เนื้อหาพิเศษ เฉพาะสำหรับสมาชิก

กรุณาล็อกอิน เพื่ออ่านเนื้อหาบทความ

ยังไม่เป็นสมาชิก

สมาชิกล็อกอิน



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




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





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

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


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


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







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