Membuat REST API dengan Lumen #part 1

By Yusida
29 Jul 2022

Halo teman ngide! Kali ini kita akan membuat series tutorial bagaimana cara membuat REST API menggunakan Lumen.

Update

Tutorial ini sudah diperbaharui dengan versi lumen 7.x, dan semestinya bisa juga diaplikasikan dari lumen versi 5.x sampai versi 8.x

Untuk yang belum tahu apa itu rest api, kamu bisa membaca artikel sebelumnya tentang kenalan dengan REST API di sini.

Diakhir tutorial ini, kalian diharapkan akan mampu membuat sebuah REST API yang bisa nanti di implementasikan ke project yang sebenarnya.

Oke langsung saja ikuti tutorial ini.

Apa itu Lumen?

Lumen adalah sebuah micro framework yang di kembangkan oleh tim Laravel yang memang dikhususkan untuk membuat sebuah REST API. Jadi dari segi performanya tidak usah di ragukan lagi.

Lightning fast micro-services and APIs delivered with the elegance you expect. ~ lumen.laravel.com

Ada beberapa alasan kenapa memilih Lumen dibandingkan micro framework lainnya:

  • Lumen itu cepat.
  • Mampu menghadle lebih banyak request/second dibandingkan bapaknya yaitu Laravel dan micro framework lainnya.
  • Menggunakan nikic/FastRoute untuk routing
  • Ada command Artisan untuk mempercepat proses development
  • Im big fans of laravel stuff (LOL)

Install Lumen

Untuk cara install lumen yang lebih lengkap kamu bisa mengunjungi dokumentasi di website lumen.

Buka terminal kesayangan kamu, dan pergi ke root folder project misalnya di folder htdocs dan jalankan perintah di bawah ini:

composer create-project --prefer-dist laravel/lumen  online-store

Tunggu sampai proses install selesai, maka kamu akan mendapati sebuah folder baru dengan nama online-store di root project kamu. Pindah ke folder itu lewat terminal dan jalankan command php artisan untuk mengecek apakah lumen sudah terinstall dengan baik.

Setting Database

Selanjutnya kita akan membuat sebuah database dengan nama online-store. Kalian juga bisa membuat nama database yang lain ya. Sesuikan juga port, database name, database username dan password sesuai dengan mysql server kalian.

Edit file .env dan ganti bagian yang di bawah ini sesuaikan dengan pengaturan user database di komputer kamu ya.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=online-store
DB_USERNAME=root
DB_PASSWORD=root

[Opsional] Sebaiknya kita membuat sebuah key dulu agar aplikasi kita lebih secure ya. Caranya kamu bisa generate random string dengan fungsi str_random(32); dan copy ke bagian key di dalam .env.

Buat Migration

Kemudian kita akan membuat 2 buah migration untuk beberapa table yang akan ada di dalam aplikasi online-store ini. Caranya jalankan perintah di bawah ini:

php artisan make:migration Products
php artisan make:migration Categories

Kamu bisa buka folder database/migrations dan edit masing-masing file migration tersebut.

Dibawah ini adalah isi dari masing-masing file migration.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Products extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->integer('category_id');
            $table->string('slug');
            $table->integer('price');
            $table->integer('weight');
            $table->text('description');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('products');
    }
}
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class Category extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('categories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('categories');
    }
}

Sekarang jalankan perintah artisan:migrate untuk membuat table diatas di database yang sudah kita buat.

php artisan:migrate

Buat Model dan Controller

Buat 2 buah file model di dalam folder app dengan nama Product.php dan Category.php.

Isi masing-masing dengan code di bawah ini:

Product.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $fillable = [
        'name',
        'category_id',
        'slug',
        'price',
        'weight',
        'description'
    ];
    public static $rules = [
        'name' => 'required',
        'category_id' => 'required',
        'slug' => 'required',
        'price' => 'required',
        'weight' => 'required',
        'description' => 'required',
    ];
}

Category.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Category extends Model
{
    protected $fillable = ['name'];
    public $timestamps = false;
    public static $rules = ['name' => 'required'];
}

Selanjutnya buat 2 buah file controller di dalam folder app/Http/Controllers.

Filenya akan kita beri nama ProductController.php dan CategoryController.php

ProductController.php

File ini akan berfungsi untuk menghandle CRUD dari object product yang akan kita buat.

<?php
namespace App\Http\Controllers;

use App\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        $products = Product::all();
        return response()->json($products);
    }
    public function store(Request $request)
    {
        Product::create($request->all());
        return response()->json(['message' => 'Successfull create new product']);
    }
    public function show($id)
    {
        $product = Product::find($id);
        return response()->json($product);
    }
    public function update(Request $request, $id)
    {
        $product = Product::find($id);
        $product->update($request->all());
        return response()->json(['message' => 'Successfull update product']);
    }
    public function delete($id)
    {
        Product::destroy($id);
        return response()->json(['message' => 'Successfull delete product']);
    }
}

CategoryController.php

<?php

namespace App\Http\Controllers;

use App\Category;
use Illuminate\Http\Request;

class CategoryController extends Controller
{
    public function index()
    {
        $categories = Category::all();
        return response()->json($categories);
    }
    public function store(Request $request)
    {
        Category::create($request->all());
        return response()->json(['message' => 'Successfull create new category']);
    }
    public function show($id)
    {
        $category = Category::find($id);
        return response()->json($category);
    }
    public function update(Request $request, $id)
    {
        $category = Category::find($id);
        $category->update($request->all());
        return response()->json(['message' => 'Successfull update category']);
    }
    public function delete($id)
    {
        Category::destroy($id);
        return response()->json(['message' => 'Successfull delete category']);
    }
}

Sebelum bisa menggunakan model di atas, kita harus mengaktifkan fungsi Eloquent dari lumen

Secara default lumen tidak memakai Eloquent.

Caranya buka file bootstrap/app.php dan hapus comment (tanda #) di depan $app->withEloquent();

Dari masing-masing file controller di atas, kita memiliki fungsi index, store,show, update dan delete yang nanti akan berfungsi untuk menghadle CRUD dari masing-masing object Product dan Category

Membuat API Routes

Kita akan membuat routing untuk menghadle CRUD dengan prefix api. Buka file web.php di dalam folder routes lalu edit seperti code di bawah ini:

<?php

/*
|--------------------------------------------------------------------------
| Application Routes
|--------------------------------------------------------------------------
|
| Here is where you can register all of the routes for an application.
| It is a breeze. Simply tell Lumen the URIs it should respond to
| and give it the Closure to call when that URI is requested.
|
*/

$router->group(['prefix' => 'api'], function () use ($router) {
    
    //product route     
    $router->get('products', 'ProductController@index');
    $router->get('products/{id}', 'ProductController@show');
    $router->post('products', 'ProductController@store');
    $router->put('products/{id}', 'ProductController@update');
    $router->delete('products/{id}', 'ProductController@delete');

    //category route
    $router->get('categories', 'CategoryController@index');
    $router->get('categories/{id}', 'CategoryController@show');
    $router->post('categories', 'CategoryController@store');
    $router->put('categories/{id}', 'CategoryController@update');
    $router->delete('categories/{id}', 'CategoryController@delete');
});

Sekarang route untuk proses CRUD sudah berhasil kita buat. Langkah selanjutnya adalah memastikan kalau api yang kita buat bisa berjalan sesuai yang kita inginkan.

oh ya, nanti setiap route di atas akan memakai prefix api. Contohnya seperti /api/products.

Testing REST API

Untuk testing api yang sudah kita buat, kamu bisa menggunakan aplikasi Postman. Jalankan PHP server untuk api yang sudah kita buat di localhost dengan menjalankan perintah di bawah ini:

php -S localhost:8000 -t public

Sekarang mengakses aplikasi kita di alamat http://localhost:8000

Test CRUD untuk produk

Buat produk baru. Kamu bisa menambah produk baru dengan mengakses /api/products dengan method POST. Lengkapi juga data body yang dibutuhkan. Jika berhasil maka akan mendapatkan response seperti dibawah ini.

Kita test juga validasi dengan menghapus beberapa field dari request body.

Get semua produk

Untuk mengakses semua produk yang sudah dibuat, kita bisa mengaksesnya lewat /api/products dengan method GET seperti di bawah ini.

Get satu produk

Untuk menampilkan satu data, kamu bisa mengakses /api/products/{id}, dimana id adalah id dari produk yang akan kita cari.

Edit produk

Untuk mengedit produk, kamu bisa mengakses /api/products/{id}, dengan body request yang akan kita edit. Kamu bisa lihat contoh di bawah ini:

Delete produk

Untuk menghapus satu produk, kamu bisa mengakses /api/products/{id} dengan method DELETE.

Kamu bisa melakukan test untuk kategori dengan cara yang sama seperti di atas.

Kesimpulan

Jadi dalam tutorial ini kita sudah berhasil membuat sebuah simple REST API dengan menggunakan Lumen. Kita sudah belajar membuat model dan controller dan juga membuat routing untuk proses CRUD. Kita juga berhasil melakukan testing api yang kita buat menggunakan Postman.

Ditutorial selanjutnya kita akan menambahkan bagaimana cara implementasi authetikasi sehingga api kita menjadi lebih aman dan hanya bisa diakses oleh user tertentu saja.

Jika ada pertanyaan bisa kirimkan lewat kolom komentar. atau hub saya via ig: @yukngide

Artikel Lainnya

Artikel lain yang mungkin menarik juga untuk kamu baca.

Quick Test Fitur Baru Laravel 6, Seberapa Efektif Lazzy Collection?

Laravel 6 sudah beberapa minggu ini release. Tentu ada beberapa update fitur-fitur keren yang patut dicoba. Yang paling menarik perhatian saya adalah Lazzy Collection.
Yusida
5 min read

Tutorial Membuat Invoice PDF di Laravel dengan DOMPDF

Halo teman ngide, kali ini kita akan membuat tutorial singkat agaimana cara membuat file PDF pada aplikasi web berbasis Laravel?
Yusida
5 min read

Helllo Laravel! Perkenalan dengan Laravel

Hello ngide, Sekarang mau bahas sebuah framework yang berkembang dengan pesat akhir-akhir ini yaitu Laravel.
Yusida
5 min read

© 2022 - NGIDE.NET. All rights reserved.