Pernah nggak kamu bertanya-tanya, gimana caranya aplikasi mobile bisa "ngobrol" sama server tanpa harus reload halaman? Atau kenapa satu backend bisa melayani website, aplikasi Android, dan iOS sekaligus? Jawabannya ada di satu kata: API. Dan kalau kamu lagi belajar Laravel, membangun RESTful API Laravel adalah skill yang wajib kamu kuasai sebelum lulus dari zona "junior developer".
Di artikel ke-39 dari 50 Artikel Belajar Laravel ini, kita akan membangun RESTful API dari nol — mulai dari konsep dasar, setup route, sampai mengembalikan response JSON yang bersih dan konsisten. Siap? Kita mulai! 🚀
🌐 Kenapa RESTful API Laravel Jadi Pilihan Utama Developer?
Bayangkan kamu punya warung makan. Pelanggannya bisa datang langsung (website), pesan via telepon (mobile app), atau lewat ojol (third-party app). Semua pemesanan masuk ke dapur yang sama — itulah fungsi API: satu backend, banyak klien.
Laravel sangat populer untuk membangun RESTful API karena ekosistemnya yang lengkap. Mulai dari routing yang ekspresif, Eloquent ORM untuk database, hingga middleware authentication bawaan — semuanya sudah tersedia out of the box.
Lebih dari 83% API publik di dunia menggunakan arsitektur REST — jauh melampaui SOAP dan GraphQL. Artinya, belajar RESTful API Laravel hari ini = langsung relevan di dunia kerja. (RapidAPI Developer Survey, 2024)
🛠️ Setup Project RESTful API Laravel dari Nol
Kita akan membuat API sederhana untuk manajemen produk (CRUD). Ikuti langkah-langkah berikut secara berurutan — jangan skip, ya!
Install Laravel & Buat Project Baru
Buka terminal dan jalankan perintah berikut untuk membuat project Laravel baru:
Buat Model, Migration, dan Controller Sekaligus
Laravel punya artisan command keren yang bisa generate ketiganya sekaligus dengan flag -mcr:
Setup Migration untuk Tabel Products
Buka file migration yang baru dibuat di database/migrations/ dan definisikan strukturnya:
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->text('description')->nullable();
$table->decimal('price', 10, 2);
$table->integer('stock')->default(0);
$table->timestamps();
});
}
Gunakan php artisan migrate:fresh --seed selama development supaya database kamu bisa di-reset dengan cepat. Jangan pakai ini di production ya — atau kamu bakal menghapus data nyata! 😅
📡 Membangun Routes & Controller RESTful API Laravel
Ini adalah inti dari tutorial kita. Di sinilah semua "pintu masuk" API kamu didefinisikan, dan logika CRUD diimplementasikan.
Daftarkan API Route di routes/api.php
Laravel menyediakan file routes/api.php khusus untuk API. Semua route di sini otomatis punya prefix /api/. Gunakan apiResource untuk generate semua CRUD routes sekaligus:
use App\Http\Controllers\ProductController;
Route::apiResource('products', ProductController::class);
/*
* Ini otomatis generate 5 routes:
* GET /api/products → index()
* POST /api/products → store()
* GET /api/products/{id} → show()
* PUT /api/products/{id} → update()
* DELETE /api/products/{id} → destroy()
*/
Implementasi ProductController Lengkap
Buka app/Http/Controllers/ProductController.php dan isi dengan logika CRUD berikut:
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class ProductController extends Controller
{
// GET /api/products — Ambil semua produk
public function index(): JsonResponse
{
$products = Product::latest()->paginate(10);
return response()->json([
'status' => 'success',
'data' => $products,
]);
}
// POST /api/products — Buat produk baru
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
'stock' => 'integer|min:0',
]);
$product = Product::create($validated);
return response()->json([
'status' => 'success',
'message' => 'Produk berhasil ditambahkan',
'data' => $product,
], 201); // HTTP 201 Created
}
// GET /api/products/{id}
public function show(Product $product): JsonResponse
{
return response()->json(['status' => 'success', 'data' => $product]);
}
// PUT /api/products/{id}
public function update(Request $request, Product $product): JsonResponse
{
$product->update($request->validated());
return response()->json(['status' => 'success', 'data' => $product]);
}
// DELETE /api/products/{id}
public function destroy(Product $product): JsonResponse
{
$product->delete();
return response()->json(['status' => 'success', 'message' => 'Produk dihapus'], 200);
}
}
Perhatikan Route Model Binding di method show(Product $product). Laravel secara otomatis mencari record berdasarkan id dari URL dan langsung inject sebagai object. Kalau tidak ditemukan, Laravel otomatis return 404. Zero boilerplate! 🎉
✅ Best Practices RESTful API Laravel yang Wajib Kamu Tahu
Bikin API yang "jalan" itu mudah. Tapi bikin API yang baik? Itu seninya. Berikut beberapa hal yang membedakan junior developer dari yang senior:
"status": "success",
"message": "Produk berhasil diambil",
"data": { ... },
"meta": { "page": 1, "total": 42 }
}
// Tidak ada wrapper, tidak ada status,
// error handling jadi mimpi buruk!
Tambahkan Model fillable & Aktifkan Mass Assignment
Jangan lupa set properti $fillable di model agar mass assignment bekerja dengan aman:
class Product extends Model
{
protected $fillable = [
'name', 'description', 'price', 'stock',
];
protected $casts = [
'price' => 'decimal:2',
'stock' => 'integer',
];
}
Test API dengan Artisan & Postman
Jalankan server development dan cek daftar routes yang tersedia:
php artisan serve
# Lihat semua API routes
php artisan route:list --path=api
# Test dengan curl (opsional)
curl -X GET http://localhost:8000/api/products \
-H "Accept: application/json"
Selalu tambahkan header Accept: application/json saat test API. Tanpa header ini, Laravel akan return redirect HTML saat terjadi error validasi — bukan JSON. Hal ini sering bikin bingung developer pemula! 😤
Setelah API kamu berjalan, langkah selanjutnya adalah merapikan format response menggunakan API Resource & Collection — topik yang akan kita bahas di artikel berikutnya (Artikel 40). API Resource memungkinkan kamu mengontrol persis field apa saja yang dikembalikan ke klien. Sangat powerful untuk keamanan dan konsistensi!
No comments:
Post a Comment