REST API adalah fondasi utama dalam pengembangan aplikasi modern, baik untuk mobile app maupun frontend terpisah (SPA). Laravel menyediakan tools yang sangat lengkap untuk membangun REST API yang bersih dan terstruktur. Dalam tutorial ini, kamu akan belajar membuat REST API CRUD (Create, Read, Update, Delete) lengkap menggunakan Laravel 10/11.
Persiapan Project Laravel
Pastikan kamu sudah memiliki project Laravel. Jika belum, buat dengan perintah berikut:
composer create-project laravel/laravel laravel-api
cd laravel-api
php artisan serve
Buat model, migration, dan resource controller sekaligus dengan satu perintah:
php artisan make:model Product -mcr
Flag -m membuat migration, -c membuat controller, dan -r menjadikannya resource controller.
Membuat Migration dan Model
Buka file migration yang baru dibuat di database/migrations/ dan tambahkan kolom yang dibutuhkan:
public function up(): void
{
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();
});
}
Kemudian edit model app/Models/Product.php:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
protected $fillable = [
'name',
'description',
'price',
'stock',
];
}
Jalankan migration:
php artisan migrate
Mendefinisikan Route API
Buka file routes/api.php dan tambahkan route resource:
<?php
use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;
Route::apiResource('products', ProductController::class);
Perintah apiResource secara otomatis membuat 5 route: index, store, show, update, dan destroy. Kamu bisa cek dengan:
php artisan route:list --path=api
Membuat API Resource untuk Response
Gunakan Laravel API Resource agar format response JSON konsisten:
php artisan make:resource ProductResource
Edit app/Http/Resources/ProductResource.php:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;
class ProductResource extends JsonResource
{
public function toArray(Request $request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'description' => $this->description,
'price' => (float) $this->price,
'stock' => $this->stock,
'created_at' => $this->created_at->toDateTimeString(),
];
}
}
Menulis Logic di Controller
Buka app/Http/Controllers/ProductController.php dan isi setiap method:
<?php
namespace App\Http\Controllers;
use App\Http\Resources\ProductResource;
use App\Models\Product;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
class ProductController extends Controller
{
public function index(): JsonResponse
{
$products = Product::latest()->paginate(10);
return ProductResource::collection($products)->response();
}
public function store(Request $request): JsonResponse
{
$validated = $request->validate([
'name' => 'required|string|max:255',
'description' => 'nullable|string',
'price' => 'required|numeric|min:0',
'stock' => 'required|integer|min:0',
]);
$product = Product::create($validated);
return (new ProductResource($product))
->response()
->setStatusCode(201);
}
public function show(Product $product): JsonResponse
{
return (new ProductResource($product))->response();
}
public function update(Request $request, Product $product): JsonResponse
{
$validated = $request->validate([
'name' => 'sometimes|string|max:255',
'description' => 'nullable|string',
'price' => 'sometimes|numeric|min:0',
'stock' => 'sometimes|integer|min:0',
]);
$product->update($validated);
return (new ProductResource($product))->response();
}
public function destroy(Product $product): JsonResponse
{
$product->delete();
return response()->json([
'message' => 'Product deleted successfully.',
]);
}
}
Menguji API dengan Postman atau cURL
Contoh request menggunakan cURL:
# GET semua produk
curl -X GET http://localhost:8000/api/products \
-H "Accept: application/json"
# POST produk baru
curl -X POST http://localhost:8000/api/products \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"name":"Laptop","price":12000000,"stock":5}'
# PUT update produk
curl -X PUT http://localhost:8000/api/products/1 \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{"price":11500000}'
# DELETE produk
curl -X DELETE http://localhost:8000/api/products/1 \
-H "Accept: application/json"
Menangani Error dengan Response Konsisten
Untuk error handling yang rapi, kamu bisa menambahkan helper response di controller atau membuat trait khusus:
// Response sukses
return response()->json([
'success' => true,
'data' => new ProductResource($product),
'message' => 'Product created successfully.',
], 201);
// Response gagal validasi (otomatis oleh Laravel)
// Status 422 Unprocessable Entity
Kesimpulan
Kamu sudah berhasil membuat REST API CRUD lengkap di Laravel menggunakan Resource Controller, API Resource untuk formatting JSON, dan validasi bawaan Laravel. Langkah selanjutnya adalah menambahkan autentikasi menggunakan Laravel Sanctum agar endpoint API kamu terlindungi. Dengan struktur ini, API kamu sudah siap dikonsumsi oleh frontend React, Vue, atau aplikasi mobile.