Kalau kamu baru mulai pakai Laravel, salah satu hal pertama yang bikin kagum adalah betapa singkatnya mendaftarkan route CRUD. Satu baris, tujuh route langsung jadi.
Tapi begitu mulai bangun API, kamu ketemu apiResource() — dan muncul pertanyaan: “Apa bedanya? Kapan pakai yang mana?”
Jawabannya sebetulnya simpel. Tapi supaya benar-benar ngerti kenapa perbedaan itu ada, kita mulai dari konteksnya dulu.
🤔 Masalah yang Mereka Selesaikan
Bayangin kamu lagi bangun aplikasi blog. Ada fitur untuk membuat, mengedit, dan menghapus artikel.
Kalau kamu bangun website biasa (server-side rendered, pakai Blade), pengguna butuh:
- Halaman untuk menampilkan form buat artikel baru
- Halaman untuk menampilkan form edit artikel yang sudah ada
Dua halaman itu — form create dan form edit — adalah HTML yang di-render oleh Laravel, dikembalikan sebagai response lengkap ke browser.
Tapi kalau kamu bangun REST API yang dikonsumsi frontend React, Vue, atau aplikasi mobile — ceritanya beda.
Frontend yang mengurus tampilan form-nya sendiri. Dia tidak butuh Laravel mengembalikan halaman HTML berisi <input> dan <textarea>. Yang dia butuh hanya data: “Tolong simpan ini”, “Tolong ambil ini”, “Tolong hapus ini”. Tidak lebih.
Nah, itulah alasan dua method ini ada. Mereka menjawab dua kebutuhan yang berbeda.
🌐 Route::resource() — Untuk Web (HTML)
Analoginya
Bayangin Route::resource() seperti paket lengkap furniture kamar tidur dari toko.
Satu paket sudah mencakup segalanya: kasur, lemari, meja rias, nakas, cermin. Semua ada karena asumsinya adalah kamu butuh semuanya untuk kamar yang fungsional.
Begitu pula dengan Route::resource() — dia mendaftarkan semua route yang dibutuhkan aplikasi web berbasis HTML, termasuk route untuk menampilkan halaman form.
Route yang Dihasilkan
// routes/web.php
Route::resource('posts', PostController::class);
Satu baris di atas menghasilkan tujuh route sekaligus:
GET /posts → index (daftar semua artikel)
GET /posts/create → create (tampilkan form buat baru) 🖊️
POST /posts → store (simpan artikel baru)
GET /posts/{post} → show (detail satu artikel)
GET /posts/{post}/edit → edit (tampilkan form edit) 🖊️
PUT/PATCH /posts/{post} → update (simpan hasil edit)
DELETE /posts/{post} → destroy (hapus artikel)
📌 Dua route yang ditandai 🖊️ — create dan edit — adalah yang membedakan resource() dari apiResource(). Keduanya mengembalikan halaman HTML berisi form, bukan data JSON.
Controller-nya
Saat pakai resource(), kamu biasanya generate controller dengan perintah:
php artisan make:controller PostController --resource
Hasilnya adalah controller dengan tujuh method kosong yang siap diisi:
class PostController extends Controller
{
public function index() { /* daftar artikel */ }
public function create() { /* tampilkan form create */ }
public function store(Request $request) { /* simpan artikel baru */ }
public function show(Post $post) { /* detail artikel */ }
public function edit(Post $post) { /* tampilkan form edit */ }
public function update(Request $request, Post $post) { /* simpan hasil edit */ }
public function destroy(Post $post) { /* hapus artikel */ }
}
📡 Route::apiResource() — Untuk API (JSON)
Analoginya
Sekarang bayangin kamu pesan paket furniture yang sama, tapi untuk apartemen yang sudah punya desainer interior sendiri. Dia tidak butuh cermin dan meja rias — dia sudah urus itu sendiri.
apiResource() adalah paket yang sama tapi sudah dikurangi bagian yang tidak relevan. Hanya sisakan yang benar-benar dibutuhkan.
Route yang Dihasilkan
// routes/api.php
Route::apiResource('posts', PostController::class);
Satu baris ini menghasilkan lima route — tanpa create dan edit:
GET /posts → index (kembalikan list JSON)
POST /posts → store (terima data JSON, simpan)
GET /posts/{post} → show (kembalikan satu data JSON)
PUT/PATCH /posts/{post} → update (terima data JSON, update)
DELETE /posts/{post} → destroy (hapus)
📌 create dan edit dihilangkan karena API tidak mengembalikan form HTML. Client (React, Vue, mobile app) yang mengurus tampilannya sendiri.
Controller-nya
php artisan make:controller PostController --api
Hasilnya controller dengan lima method — tanpa create dan edit:
class PostController extends Controller
{
public function index() { /* return JSON list */ }
public function store(Request $request) { /* simpan, return JSON */ }
public function show(Post $post) { /* return JSON satu data */ }
public function update(Request $request, Post $post) { /* update, return JSON */ }
public function destroy(Post $post) { /* hapus */ }
}
🗺️ Gambaran Besar — Siapa Mengurus Apa
Route::resource()
┌─────────────────────────────────────┐
│ Laravel │
│ ├── Render form create (HTML) │
│ ├── Render form edit (HTML) │
│ ├── Terima submit form │
│ └── Return response (redirect/view)│
└─────────────────────────────────────┘
Route::apiResource()
┌─────────────────────────────────────┐
│ Client (React / Vue / Mobile) │
│ ├── Render form create │
│ └── Render form edit │
└─────────────────────────────────────┘
↕ HTTP Request (JSON)
┌─────────────────────────────────────┐
│ Laravel │
│ ├── Terima data JSON │
│ └── Return response JSON │
└─────────────────────────────────────┘
✂️ Bonus — only() dan except()
Tidak selalu kamu butuh semua route yang didaftarkan. Misalnya resource komentar — mungkin kamu hanya perlu store dan destroy, tanpa perlu halaman list atau detail.
Dua method ini membantu:
only() — daftarkan yang disebutkan saja:
Route::resource('comments', CommentController::class)
->only(['store', 'destroy']);
except() — daftarkan semua kecuali yang disebutkan:
Route::resource('posts', PostController::class)
->except(['create', 'edit']);
📌 only() dan except() bisa dipakai di keduanya — baik resource() maupun apiResource(). Berguna kalau ada route yang sengaja tidak ingin diekspos.
🧭 Jadi, Kapan Pakai Yang Mana?
Pakai Route::resource() ketika: Aplikasi kamu server-side rendered — artinya Laravel yang mengurus halaman HTML, termasuk form create dan edit. Cocok untuk aplikasi web tradisional yang pakai Blade.
Pakai Route::apiResource() ketika: Kamu bangun REST API — baik untuk SPA (React, Vue, Next.js), aplikasi mobile, atau layanan backend-to-backend. Client yang mengurus tampilan form, Laravel hanya terima dan kirim data JSON.
📊 Perbandingan Singkat
resource() | apiResource() | |
|---|---|---|
| Jumlah route | 7 | 5 |
Include create & edit | ✅ | ❌ |
| Response yang umum | HTML / redirect | JSON |
| Cocok untuk | Aplikasi web (Blade) | REST API |
| Perintah artisan | --resource | --api |
| File route | routes/web.php | routes/api.php |
💡 Ingat!
Perbedaan antara keduanya bukan soal mana yang lebih canggih atau lebih modern. Ini murni soal siapa yang bertanggung jawab atas tampilan form.
Kalau Laravel yang urus formnya — pakai resource(). Kalau frontend yang urus — pakai apiResource().
Dan kalau kamu lupa route mana saja yang sudah terdaftar, selalu bisa cek dengan:
php artisan route:list
Semua route akan terlihat rapi di sana, lengkap dengan nama, method, dan controller-nya.