Controller adalah class yang mengumpulkan kode penjawab request untuk satu fitur. Route-nya tinggal menunjuk: "alamat ini dijawab method itu". Bayangin meja layanan buku di perpustakaan. Petugas di pintu (route) cuma mengarahkan tamu, semua urusan buku dikerjakan di satu meja (controller), dan tiap urusan punya petugasnya sendiri: satu menunjukkan daftar, satu mencarikan satu buku (method).
🧪 Tebakan cepat: satu baris
Route::resource('books', BookController::class);mendaftarkan berapa route: 1, 5, atau 7? Tebak dulu, jawabannya ada di bagian "Resource controller: tujuh method sekaligus".
Bikin controller
Controller dibuat dengan Artisan:
php artisan make:controller BookController
INFO Controller [app/Http/Controllers/BookController.php] created successfully.
File barunya masih kosong:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class BookController extends Controller
{
//
}
- Namanya diakhiri
Controllerdan ditulis PascalCase:BookController,SiswaController. namespace App\Http\Controllers;adalah "alamat" class ini, sesuai foldernya.extends Controllermewarisi controller dasar milik app-mu.
Isi method-nya
Isi dua method untuk app Perpustakaan. Datanya masih array biasa; di pelajaran Eloquent, array ini diganti data dari database.
class BookController extends Controller
{
private array $books = [
1 => ['id' => 1, 'title' => 'Laskar Pelangi', 'author' => 'Andrea Hirata'],
2 => ['id' => 2, 'title' => 'Bumi Manusia', 'author' => 'Pramoedya Ananta Toer'],
3 => ['id' => 3, 'title' => 'Cantik Itu Luka', 'author' => 'Eka Kurniawan'],
];
public function index()
{
return response()->json(array_values($this->books));
}
public function show(string $id)
{
if (! isset($this->books[$id])) {
return response()->json(['message' => 'Buku tidak ditemukan'], 404);
}
return response()->json($this->books[$id]);
}
}
- Tiap method
publicbisa jadi penjawab route. Namanya bebas, tapi Laravel punya nama baku:indexuntuk daftar,showuntuk satu data. - Yang di-
returnjadi response, sama seperti closure di route. show(string $id)menerima parameter{id}dari alamat, sebagai string.- Buku yang gak ada dijawab
404oleh controller sendiri, dengan pesan JSON.
Menghubungkan route ke controller
<?php
use App\Http\Controllers\BookController;
use Illuminate\Support\Facades\Route;
Route::get('/books', [BookController::class, 'index'])->name('books.index');
Route::get('/books/{id}', [BookController::class, 'show'])->name('books.show');
[BookController::class, 'index']artinya "classBookController, methodindex".use App\Http\Controllers\BookController;wajib ada, supaya namaBookControllermenunjuk ke class yang benar.
Saat route cocok, Laravel membuat objek BookController lalu memanggil method-nya:
| Request | Route | Laravel memanggil | Jawaban |
|---|---|---|---|
GET /books |
books.index |
index() |
200 daftar tiga buku |
GET /books/2 |
books.show |
show('2') |
200 {"id":2,"title":"Bumi Manusia",...} |
GET /books/9 |
books.show |
show('9') |
404 {"message":"Buku tidak ditemukan"} |
Resource controller: tujuh method sekaligus
Fitur seperti buku hampir selalu butuh tujuh aksi yang sama. Artisan bisa langsung membuat ketujuh method-nya (kosong, berisi //):
php artisan make:controller BookController --resource
--resource boleh disingkat -r. Lalu satu baris route mendaftarkan semuanya:
Route::resource('books', BookController::class);
$ php artisan route:list --except-vendor
GET|HEAD books ................... books.index › BookController@index
POST books ................... books.store › BookController@store
GET|HEAD books/create .......... books.create › BookController@create
GET|HEAD books/{book} .............. books.show › BookController@show
PUT|PATCH books/{book} .......... books.update › BookController@update
DELETE books/{book} ........ books.destroy › BookController@destroy
GET|HEAD books/{book}/edit ......... books.edit › BookController@edit
Showing [7] routes
Tujuh route. Itu jawaban tebakannya. Ketujuh method-nya: index (daftar), create (form tambah), store (simpan yang baru), show (satu buku), edit (form ubah), update (simpan perubahan), destroy (hapus). Parameternya bernama {book}, bentuk tunggal dari books. /books/create didaftarkan sebelum /books/{book}, jadi jebakan urutan di pelajaran Routing gak terjadi.
Untuk API yang gak punya halaman form, pakai php artisan make:controller BookController --api dan Route::apiResource(...): lima route, tanpa create dan edit.
⚠️ Jebakan yang sering ketemu
- Lupa baris
use. Tanpause App\Http\Controllers\BookController;, request-nya gagal denganTarget class [BookController] does not exist. - Route-nya ada, method-nya belum.
Route::resourcedengan controller yang cuma punyaindexdanshow: membuka/books/creategagal denganCall to undefined method App\Http\Controllers\BookController::create(). - Lupa
return. Method tanpareturnmenjawab200dengan body kosong. - Data latihannya. Simulator mencetak
GET /products → 200lalu membaca"name":"Laptop"dari jawabanindex(), jadi daftar produkmu harus memuat produk bernamaLaptop, dan jawabannya disusun denganresponse()->json(...).
TL;DR: Controller mengumpulkan kode penjawab request satu fitur dalam satu class di app/Http/Controllers. Buat dengan php artisan make:controller BookController, isi method-nya, lalu hubungkan dengan Route::get('/books', [BookController::class, 'index']) plus use App\Http\Controllers\BookController;. Parameter {id} masuk sebagai argumen method. --resource (atau -r) membuat tujuh method: index, create, store, show, edit, update, destroy, dan Route::resource('books', BookController::class) mendaftarkan tujuh route-nya. --api dan Route::apiResource membuat lima, tanpa create dan edit.