Tutorial Laravel: Membuat REST API Sederhana untuk Aplikasi Mobile

Kalau kamu mau bikin aplikasi mobile (Flutter, React Native) tapi bingung bagaimana caranya aplikasi itu mengambil dan menyimpan data, jawabannya hampir selalu: REST API. REST API adalah jembatan antara aplikasi dan database. Di tutorial ini kita bangun API produk lengkap dari nol — dengan kode yang bisa langsung kamu copy-paste.

1. Persiapan: Buat Proyek Laravel Baru

Pastikan PHP 8.2+ dan Composer sudah terinstall. Lalu buat proyek baru dan masuk ke foldernya:

composer create-project laravel/laravel api-toko
cd api-toko

Atur koneksi database di file .env. Untuk belajar, SQLite paling gampang — cukup buat file database kosong lalu arahkan .env ke sana:

touch database/database.sqlite
# di .env:
DB_CONNECTION=sqlite

2. Buat Migration untuk Tabel Produk

Jalankan perintah artisan untuk membuat migration:

php artisan make:migration create_produks_table

Buka file migration yang baru dibuat di database/migrations, lalu isi method up() seperti ini:

<?php

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

return new class extends Migration {
    public function up(): void
    {
        Schema::create('produks', function (Blueprint $table) {
            $table->id();
            $table->string('nama');
            $table->decimal('harga', 12, 2);
            $table->integer('stok')->default(0);
            $table->timestamps();
        });
    }

    public function down(): void
    {
        Schema::dropIfExists('produks');
    }
};

Jalankan migration-nya:

php artisan migrate

3. Buat Model Produk

Jalankan:

php artisan make:model Produk

Buka app/Models/Produk.php dan tambahkan $fillable supaya field-nya boleh diisi massal:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Produk extends Model
{
    protected $fillable = ['nama', 'harga', 'stok'];
}

4. Tulis Controller Lengkap

Buat controller dengan perintah ini:

php artisan make:controller ProdukController

Buka app/Http/Controllers/ProdukController.php dan ganti seluruh isinya dengan kode berikut. Lima method ini menangani semua operasi CRUD, lengkap dengan validasi:

<?php

namespace App\Http\Controllers;

use App\Models\Produk;
use Illuminate\Http\Request;

class ProdukController extends Controller
{
    // GET /api/produk — tampilkan semua produk
    public function index()
    {
        return response()->json(Produk::all());
    }

    // POST /api/produk — tambah produk baru
    public function store(Request $request)
    {
        $validated = $request->validate([
            'nama'  => 'required|string|max:255',
            'harga' => 'required|numeric|min:0',
            'stok'  => 'required|integer|min:0',
        ]);

        $produk = Produk::create($validated);

        return response()->json($produk, 201);
    }

    // GET /api/produk/{id} — tampilkan satu produk
    public function show(Produk $produk)
    {
        return response()->json($produk);
    }

    // PUT /api/produk/{id} — ubah produk
    public function update(Request $request, Produk $produk)
    {
        $validated = $request->validate([
            'nama'  => 'sometimes|string|max:255',
            'harga' => 'sometimes|numeric|min:0',
            'stok'  => 'sometimes|integer|min:0',
        ]);

        $produk->update($validated);

        return response()->json($produk);
    }

    // DELETE /api/produk/{id} — hapus produk
    public function destroy(Produk $produk)
    {
        $produk->delete();

        return response()->json(['message' => 'Produk dihapus']);
    }
};

Perhatikan Produk $produk di parameter method: itu fitur route model binding — Laravel otomatis mencari produk berdasarkan ID di URL, dan mengembalikan error 404 kalau tidak ketemu. Kamu tidak perlu menulis Produk::findOrFail() manual.

5. Daftarkan Route API

Buka routes/api.php dan tambahkan:

use App\Http\Controllers\ProdukController;

Route::apiResource('produk', ProdukController::class);

Satu baris itu otomatis membuat 5 endpoint. Cek dengan:

php artisan route:list --path=api

Kamu akan melihat: GET /api/produk, POST /api/produk, GET /api/produk/{produk}, PUT/PATCH /api/produk/{produk}, dan DELETE /api/produk/{produk}.

6. Tes Semua Endpoint

Jalankan server development:

php artisan serve

Lalu tes dari terminal lain dengan curl. Tambah produk baru:

curl -X POST http://localhost:8000/api/produk \
  -H "Content-Type: application/json" \
  -d '{"nama":"Kopi Susu","harga":15000,"stok":50}'

Lihat semua produk:

curl http://localhost:8000/api/produk

Responsnya berupa JSON seperti ini:

[
  {
    "id": 1,
    "nama": "Kopi Susu",
    "harga": "15000.00",
    "stok": 50,
    "created_at": "2026-10-05T08:00:00.000000Z",
    "updated_at": "2026-10-05T08:00:00.000000Z"
  }
]

Ubah stok produk id 1, lalu hapus:

curl -X PUT http://localhost:8000/api/produk/1 \
  -H "Content-Type: application/json" \
  -d '{"stok":45}'

curl -X DELETE http://localhost:8000/api/produk/1

Kalau validasi gagal (misalnya harga dikirim sebagai teks), Laravel otomatis mengembalikan error 422 beserta pesan kesalahannya — aplikasi mobile-mu tinggal menampilkan pesan itu ke pengguna.

7. Bonus: Amankan API dengan Sanctum

API publik boleh diakses siapa saja, tapi endpoint tambah/ubah/hapus sebaiknya butuh login. Laravel Sanctum memberi autentikasi token yang simpel:

composer require laravel/sanctum
php artisan vendor:publish --provider="Laravel\Sanctum\SanctumServiceProvider"
php artisan migrate

Tambahkan trait HasApiTokens ke model User, lalu lindungi route yang sensitif:

Route::apiResource('produk', ProdukController::class)->except(['index', 'show'])
    ->middleware('auth:sanctum');

Route::apiResource('produk', ProdukController::class)->only(['index', 'show']);

Alur loginnya: aplikasi mobile mengirim email+password ke endpoint login, server membalas dengan token ($user->createToken('mobile')->plainTextToken), dan setiap request berikutnya menyertakan header Authorization: Bearer TOKEN. Sanctum mengurus sisanya.

Kesimpulan

Sekarang kamu punya API CRUD lengkap: migration, model, controller bervalidasi, route otomatis, cara mengetesnya, plus pengaman token. Pola model–controller–route inilah yang dipakai hampir semua aplikasi modern — backend Laravel menyajikan JSON, frontend (web atau mobile) tinggal mengonsumsinya. Kuasai pola ini sekali, dan kamu bisa membangun backend untuk aplikasi apa pun. Kalau butuh inspirasi aplikasi jadi yang siap dipakai, lihat koleksinya di PecutAigan.

Komentar