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
Daftar Isi
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.
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