Membuat Restful API di Codeigniter 4 (CRUD)

Di sini saya akan membuat Restful API berupa CRUD master kategori sederhana menggunakan Framework Codeigniter 4,

biasanya restful API sendiri digunakan untuk para backend developer dan fullstack developer untuk membuat sebuah res server API agar data dapat diakses / dikonsumsi oleh aplikasi frontend melalui API.

Tutorial ini bersumber dari dokumentasi langsung Codeigniter 4 https://codeigniter.com/user_guide/incoming/restful.html dan https://codeigniter.com/user_guide/outgoing/api_responses.html

Untuk penjelasan dasar apa itu API mungkin sudah banyak tersedia di blog lainnya, saya akan langsung ke praktek saja, sebelum masuk ke tahapan, saya paparkan dulu fitur CI 4 apa saja yang digunakan, saya menggunakan fitur (Validation & Routes, juga menngunakan 1 model dengan konsep 1 model 1 database) dalam proses CRUD.

EndPoint RESTful API menggunakan HTTP verbs, dan yang umum digunakan adalah GET, POST, PUT, dan DELETE berikut table penjelasan nya :

METHODENDPOINTDESCRIPTION
GET/categoryList of Category
GET/category/{id}View a Category
POST/categoryCreate New Category
PUT/category/{id}Update a Category
DELETE/category/{id}Delete a Category

oke langsung saja berikut tahapan nya :

(STEP 01) Buat database dengan nama db_cobaapi, dan buat juga 1 tabel dengan nama t_category:

CREATE DATABASE db_cobaapi;
CREATE TABLE t_category(
id INT(5) PRIMARY KEY AUTO_INCREMENT,
kode_kategori INT(5),
nama_kategori VARCHAR(200)
)ENGINE=INNODB;
INSERT INTO t_category(kode_kategori,nama_kategori) VALUES
('1','Makanan'),
('2','Minuman');

(STEP 02) install Codeigniter 4, jika belum ada file CI 4 atau belum tau cara instal CI 4 nya bisa lihat tutorial ini cara install codeigniter 4 via composer , dan jika sudah terinstall CI 4 nya bisa langsung lakukan konfigurasi database sesuai database dan table yang barusan kita buat si step 1 :

rename juga file env menjadi .env , lalu buka file .env dan ubah sebagian script di dalamnya seperti berikut :

#CI_ENVIRONMENT = production

ubah menjadi

CI_ENVIRONMENT = development

lalu sesuaikan database

# database.default.hostname = localhost
# database.default.database = ci4
# database.default.username = root
# database.default.password = root
# database.default.DBDriver = MySQLi
# database.default.DBPrefix =

ubah menjadi

database.default.hostname = localhost
database.default.database = db_cobaapi
database.default.username = root
database.default.password = 
database.default.DBDriver = MySQLi
database.default.DBPrefix =

(STEP 03) buat routes dan model, untuk routes bisa dibuka file nya di folder app/config/Routes.php dan isikan script seperti ini :

$routes->resource('master_category');

script itu dimaksudkan untuk menyingkat dari banyak nya route jika manual di tuliskan, seperti penjelasan di dokumentasi ci 4 nya . untuk master_category sendiri adalah sesuai nama controller yang akan kita buat nanti.

lalu buat model dengan nama M_master_category.php di folder app/models/ dan isikan script di bawah ini :

<?php
namespace App\Models;

use CodeIgniter\Model;
use Exception;

class M_master_category extends Model
{
    protected $table = 't_category';
    protected $primaryKey = 'id';
    protected $allowedFields = ['kode_kategori','nama_kategori'];
	protected $useTimestamps = false;

    public function findById($id)
    {
        $data = $this->find($id);
        if($data)
        {
            return $data;
        }
        return false;
    }
}

(STEP 04) buat controller dengan nama Master_category.php di folder app/controllers/ dan isikan script di bawah ini :

<?php

namespace App\Controllers;
use CodeIgniter\RESTful\ResourceController;
use CodeIgniter\API\ResponseTrait;

class Master_category extends BaseController
{
    /*model*/
    protected $M_master_category;
    /*db*/
    protected $db;
	use ResponseTrait;
    
    public function __construct()
    {
        $this->mdl = new \App\Models\M_master_category();
        $this->validation = \Config\Services::validation();
        $this->db = \Config\Database::connect();
    }

    public function index()
    {
        $data = $this->mdl->findAll();
        return $this->respond($data, 200);
    }

	// get single show
    public function show($id = null)
    {
        $data = $this->mdl->findById($id);
        if($data){
            return $this->respond($data);
        }else{
            return $this->failNotFound('No Data Found with id '.$id);
        }
    }

	// create a data
    public function create()
    {
		$kode_kategori = $this->request->getPost('kode_kategori');
		$nama_kategori = $this->request->getPost('nama_kategori');
        $data = [
			'kode_kategori' => $kode_kategori,
            'nama_kategori' => $nama_kategori
        ];
		$validate = $this->validation->run($data, 'create_master_category');
		$errors = $this->validation->getErrors();

        if($errors){
            return $this->fail($errors);
        }

        $this->mdl->insert($data);
        $response = [
            'status'   => 201,
            'error'    => null,
            'messages' => [
                'success' => 'Data Saved'
            ]
        ];
         
        return $this->respondCreated($data, 201);
    }

	// update a data
	public function update($id = null)
    {
        $data = $this->request->getRawInput();
        $data['id'] = $id;
        $validate = $this->validation->run($data, 'update_master_category');
        $errors = $this->validation->getErrors();

        if($errors){
            return $this->fail($errors);
        }

        if(!$this->mdl->findById($id))
        {
            return $this->fail('id tidak ditemukan');
        }

		$this->mdl->update($id, $data);
        $response = [
            'status'   => 200,
            'error'    => null,
            'messages' => [
                'success' => 'Data Updated'
            ]
        ];
        return $this->respond($response);
    }

	// delete a data
    public function delete($id = null)
    {
        if(!$this->mdl->findById($id))
        {
            return $this->fail('id tidak ditemukan');
        }

        if($this->mdl->delete($id)){
            return $this->respondDeleted(['id'=>$id.' Deleted']);
        }
    }
}

(STEP 05) buat validation di folder app/config/Validation.php dan buat script menjadi seperti ini :

<?php

namespace Config;

use CodeIgniter\Validation\CreditCardRules;
use CodeIgniter\Validation\FileRules;
use CodeIgniter\Validation\FormatRules;
use CodeIgniter\Validation\Rules;

class Validation
{
    //--------------------------------------------------------------------
    // Setup
    //--------------------------------------------------------------------

    /**
     * Stores the classes that contain the
     * rules that are available.
     *
     * @var string[]
     */
    public $ruleSets = [
        Rules::class,
        FormatRules::class,
        FileRules::class,
        CreditCardRules::class,
    ];

    /**
     * Specifies the views that are used to display the
     * errors.
     *
     * @var array<string, string>
     */
    public $templates = [
        'list'   => 'CodeIgniter\Validation\Views\list',
        'single' => 'CodeIgniter\Validation\Views\single',
    ];

    //--------------------------------------------------------------------
    // Rules
    //--------------------------------------------------------------------
    public $create_master_category = [
		'kode_kategori' => [
			'rules' => 'required|max_length[5]|is_natural|is_unique[t_category.kode_kategori]',	
		],
		'nama_kategori' => [
			'rules' => 'required',
		]
	];
    public $update_master_category = [
		'kode_kategori' => [
			'rules' => 'required|max_length[5]|is_natural|is_unique[t_category.kode_kategori,id,{id}]',	
		],
		'nama_kategori' => [
			'rules' => 'required',
		]
	];
}

lalu setting CORS di folder app/config/Filters.php seperti ini :

<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;
use CodeIgniter\Filters\CSRF;
use CodeIgniter\Filters\DebugToolbar;
use CodeIgniter\Filters\Honeypot;

//for api
use App\Filters\Cors;

class Filters extends BaseConfig
{
    /**
     * Configures aliases for Filter classes to
     * make reading things nicer and simpler.
     *
     * @var array
     */
    public $aliases = [
        'csrf'     => CSRF::class,
        'toolbar'  => DebugToolbar::class,
        'honeypot' => Honeypot::class,
        //for api
        'cors'     => Cors::class, 
    ];

    /**
     * List of filter aliases that are always
     * applied before and after every request.
     *
     * @var array
     */
    public $globals = [
        'before' => [
            // 'honeypot',
            // 'csrf',
            'cors'
        ],
        'after' => [
            'toolbar',
            // 'honeypot',
        ],
    ];

    /**
     * List of filter aliases that works on a
     * particular HTTP method (GET, POST, etc.).
     *
     * Example:
     * 'post' => ['csrf', 'throttle']
     *
     * @var array
     */
    public $methods = [];

    /**
     * List of filter aliases that should run on any
     * before or after URI patterns.
     *
     * Example:
     * 'isLoggedIn' => ['before' => ['account/*', 'profiles/*']]
     *
     * @var array
     */
    public $filters = [];
}

dan buat file dengan nama Cors.php dan simpan di folder app/Filters dengan isi script ini :

<?php namespace App\Filters;
 
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;
 
Class Cors implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        header('Access-Control-Allow-Origin: *');
        header("Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method, Authorization");
        header("Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE");
        $method = $_SERVER['REQUEST_METHOD'];
        if ($method == "OPTIONS") {
        die();
        }
    }
 
    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
      // Do something here
    }
}

selesai sekarang coba jalankan xampp nya, lalu coba test Restfull API apakah sudah berjalan, berikut hasil testing di localhost menggunakan tools postman, lalu jalankan aplikasi ci4 kita dengan ketika php spark serve di CMD, dan akses API di browser bisa langsung ketikan http://localhost:8080/master_category
jika di akses di browser :

kita coba dengan menampilkan seluruh data dengan method GET dengan alamat url http://localhost:8080/master_category :

lalu coba tampilkan single data dengan method GET dengan alamat URL http://localhost:8080/master_category/1 :

kita coba sekarang create data dengan method POST dengan alamat URL http://localhost:8080/master_category :

lalu kita coba update data dengan method PUT dengan alamat URL http://localhost:8080/master_category/1 :

dan terakhir kita coba delete data dengan method DELETE dengan alamat URL http://localhost:8080/master_category/2 :

Finish selamat mencoba.

Untuk dapatkan full source code download di sini : https://github.com/zaiheryf/ci4_apibasic

Leave a Reply

Your email address will not be published. Required fields are marked *

Home
Shop
Project
Blog
Search