Bab 4 — Route dan Kerangka Controller
4.1Konsep
Route = resepsionis
Saat pengunjung mengetik /siswa/create, Laravel bertanya: "siapa yang melayani alamat ini?". Route menjawab: "method create milik SiswaController." Semua jawaban itu ditulis di routes/web.php.
Route::resource = tujuh rute sekaligus
CRUD memakai pola alamat yang selalu sama. Daripada menulis tujuh baris, Laravel menyediakan satu baris Route::resource:
| Method HTTP | URI | Nama rute | Method controller | Tugas |
|---|---|---|---|---|
| GET | /siswa |
siswa.index |
index |
Daftar siswa |
| GET | /siswa/create |
siswa.create |
create |
Formulir tambah |
| POST | /siswa |
siswa.store |
store |
Simpan siswa baru |
| GET | /siswa/{siswa} |
siswa.show |
show |
Lihat satu siswa |
| GET | /siswa/{siswa}/edit |
siswa.edit |
edit |
Formulir ubah |
| PUT/PATCH | /siswa/{siswa} |
siswa.update |
update |
Simpan perubahan |
| DELETE | /siswa/{siswa} |
siswa.destroy |
destroy |
Hapus |
Route model binding
Pada alamat seperti /siswa/5/edit, bagian {siswa} adalah nomor id. Kalau method controller menulis edit(Siswa $siswa), Laravel otomatis mencari siswa ber-id 5 dan memberikannya kepadamu. Kalau tidak ada, Laravel membalas 404 tanpa kamu menulis kode apa pun.
4.2Langkah 1 — Isi routes/web.php
📄 Ganti seluruh isi berkas routes/web.php
Baris pertama mengalihkan alamat utama / ke daftar siswa. Baris kedua mendaftarkan tujuh rute.
4.3Langkah 2 — Lihat daftar rute
Isi tabel di bukumu dari keluaran perintah itu, bukan dari tebakan. Bandingkan hasilnya dengan tabel 4.1:
| Method HTTP | URI | Nama Rute | Method Controller |
|---|---|---|---|
| GET|HEAD | siswa | siswa.index | index |
| … | … | … | … |
Pertanyaan: ada berapa rute? Kenapa bukan hanya empat (satu per huruf CRUD)?
4.4Langkah 3 — Uji jalur dengan teks sederhana
Sebelum ada tampilan apa pun, kita cek dulu bahwa jalurnya benar. Buka app/Http/Controllers/SiswaController.php dan ubah isi method index() sementara menjadi:
📄 Berkas app/Http/Controllers/SiswaController.php — ubah sementara index()
Jalankan php artisan serve, lalu buka satu per satu:
| Alamat | Yang harus terlihat |
|---|---|
http://127.0.0.1:8000/siswa |
Teks Halo dari index() |
http://127.0.0.1:8000/ |
Otomatis pindah ke /siswa |
http://127.0.0.1:8000/siswa/1 |
Halaman kosong tanpa galat |
http://127.0.0.1:8000/siswa/9999 |
Halaman 404 |
Kenapa /siswa/1 kosong, bukan galat? Karena -r tadi membuat method show() yang isinya kosong (hanya komentar //), dan Laravel mengirimkan jawaban kosong. Aplikasi kita tidak memakai halaman show, jadi kita biarkan. Kenapa /siswa/9999 menjadi 404? Itu route model binding yang bekerja.
⚠️ Halaman /siswa/1 hanya muncul kosong kalau siswa dengan id 1 ada. Itu ada karena kamu menjalankan seeder di Bab 3.
4.5Jalankan test
Empat test memeriksa: ketujuh rute terdaftar, alamat / dialihkan ke /siswa, /siswa bisa dibuka (kode 200), dan rute show ada tetapi halamannya kosong. Harapannya: Tests: 4 passed.
Titik periksa Bab 4
Centang setiap butir yang sudah kamu selesaikan.
php artisan route:list --name=siswamenampilkan 7 rute dan tabel di bukuku sudah terisi dari keluaran itu./siswamenampilkan teksHalo dari index()./otomatis pindah ke/siswa./siswa/1kosong,/siswa/9999menghasilkan 404, dan aku bisa menjelaskan kenapa.php artisan test --filter=RuteSiswaTest→ 4 test hijau.
Pertanyaan pemahaman
- Apa fungsi
Route::resource? Berapa rute yang dibuatnya, dan rute mana yang tidak kita pakai di aplikasi ini? - Apa beda alamat
/siswa(GET) dengan/siswa(POST)? Method controller mana yang melayani masing-masing? - Apa itu route model binding? Apa yang terjadi kalau
id-nya tidak ada? - Apa yang terjadi kalau
Route::resourcedihapus dan keenam rute yang kita pakai ditulis manual satu per satu? Apakah aplikasinya tetap jalan?
Tantangan
Tulis satu rute manual di bawah Route::resource, misalnya Route::get('/tentang', fn () => 'Aplikasi Les Cerdas Mandiri');, lalu buka /tentang dan jalankan php artisan route:list. Rute barumu muncul di mana? Setelah selesai, hapus lagi.
Kesalahan umum
| Gejala | Penyebab & solusi |
|---|---|
Target class [App\Http\Controllers\SiswaController] does not exist |
Controller belum dibuat, atau use App\Http\Controllers\SiswaController; belum ditulis di web.php. |
/siswa menghasilkan 404 |
Route::resource belum disimpan, atau salah ketik nama ('siswa'). |
route:list tidak menampilkan rute siswa |
Salah ketik pada --name=siswa, atau web.php belum disimpan. |
/siswa/1 menghasilkan 404 padahal sudah seed |
Database kosong atau id berbeda. Cek Siswa::all() di tinker. |
Perubahan di web.php tidak terlihat |
Simpan berkas (Ctrl+S) lalu muat ulang browser dengan Ctrl+F5. |
➡️ Lanjut ke Bab 5 — Read: Daftar Siswa.