Bab 8 — Delete: Menghapus Data Siswa
8.1Konsep
Menghapus itu satu method
Tidak ada formulir terpisah seperti create atau edit. Tombol Hapus langsung mengirim permintaan.
Kenapa Hapus bukan tautan biasa?
Tautan biasa (<a href="/siswa/5/hapus">) dikirim lewat GET. Itu berbahaya untuk aksi yang mengubah data karena:
- mesin pencari atau ekstensi peramban yang "mengikuti semua tautan" bisa menghapus data tanpa disengaja;
- pengguna bisa tanpa sengaja menghapus hanya dengan membuka alamat;
- alamat GET bisa disimpan di riwayat dan dibuka ulang.
Karena itu penghapusan memakai formulir yang dikirim lewat POST dengan penanda @method('DELETE'), seperti @method('PUT') di Bab 7.
Konfirmasi
Sebelum formulir dikirim, peramban menampilkan kotak konfirmasi lewat atribut onsubmit="return confirm('...')". Kalau pengguna menekan Batal, confirm() mengembalikan false dan formulir tidak dikirim.
8.2Langkah 1 — Isi destroy()
📄 Berkas app/Http/Controllers/SiswaController.php — ganti isi method destroy()
Dua baris inti: $siswa->delete() menghapus baris itu, lalu redirect kembali ke daftar dengan pesan sukses.
8.3Membaca tombol Hapus
Buka index.blade.php dan temukan bagian Aksi:
| Potongan | Artinya |
|---|---|
action="{{ route('siswa.destroy', $siswa->id) }}" method="POST" |
Dikirim ke rute siswa.destroy. |
onsubmit="return confirm('Yakin ingin menghapus data ini?')" |
Minta konfirmasi sebelum mengirim. |
@csrf |
Token keamanan. |
@method('DELETE') |
Penanda bahwa ini permintaan DELETE. |
<button type="submit" class="btn btn-danger btn-sm">Hapus</button> |
Tombol yang mengirim formulir. |
8.4💥 Percobaan: apakah menghapus bisa lewat alamat?
Buka http://127.0.0.1:8000/siswa/1 di browser (GET, bukan formulir). Apakah siswa terhapus? Tidak. Halaman kosong muncul karena itu rute show, dan tidak ada rute GET yang menghapus. Itulah yang dijaga oleh @method('DELETE'): menghapus hanya bisa lewat permintaan DELETE.
8.5Uji coba
- Klik Hapus pada satu siswa, lalu pilih Batal di kotak konfirmasi. Data tetap ada.
- Klik Hapus lagi, pilih OK. Siswa hilang dan muncul pesan hijau Data siswa berhasil dihapus!. Siswa lain tidak berubah.
- Hapus semua siswa satu per satu. Muncul tulisan Belum ada data siswa. Isi lagi dengan
php artisan db:seed --class=SiswaSeeder.
8.6Jalankan test
Lima test memeriksa: siswa terhapus dan kembali ke daftar, pesan sukses muncul, hanya siswa yang dipilih yang terhapus, hapus siswa yang tidak ada menghasilkan 404, dan tombol Hapus memakai penanda method DELETE. Harapannya: Tests: 5 passed.
Titik periksa Bab 8
Centang setiap butir yang sudah kamu selesaikan.
- Klik Hapus lalu Batal: data tetap ada.
- Klik Hapus lalu OK: data hilang, pesan hijau muncul, siswa lain tidak berubah.
- Membuka
/siswa/1lewat alamat tidak menghapus apa pun. php artisan test --filter=HapusSiswaTest→ 5 test hijau.- Sekarang aplikasi punya empat fitur: daftar, tambah, ubah, hapus.
Pertanyaan pemahaman
- Kenapa tombol Hapus dibuat sebagai formulir POST +
@method('DELETE'), bukan tautan<a href>? - Apa yang dilakukan
confirm()ketika pengguna menekan Batal? - Kenapa ada test khusus "hanya siswa yang dipilih yang terhapus"? Bug apa yang dilindunginya?
- Setelah
delete(), kenapa kitaredirectdan tidak langsung menampilkan daftar?
Tantangan
Ubah penghapusan menjadi hapus lunak (soft delete): data tidak benar-benar hilang, hanya ditandai terhapus. Langkahnya: tambahkan $table->softDeletes(); ke migration, use SoftDeletes; di model, lalu php artisan migrate:fresh. Perhatikan test mana yang berubah hasilnya (petunjuk: assertDatabaseMissing), dan kenapa. Setelah selesai, kembalikan agar test tetap hijau.
Kesalahan umum
| Gejala | Penyebab & solusi |
|---|---|
405 Method Not Allowed saat Hapus |
@method('DELETE') hilang dari formulir. |
419 Page Expired |
@csrf hilang dari formulir Hapus. |
| Kotak konfirmasi tidak muncul | Atribut onsubmit di tag <form> salah ketik atau terhapus. |
| Hapus satu siswa tetapi semua hilang | Kode destroy() menghapus kumpulan data, bukan $siswa. Pastikan $siswa->delete(). |
| Halaman galat setelah Hapus | redirect()->route('siswa.index') salah ketik nama rute. |
➡️ Lanjut ke Bab 9 — Uji Merusak Aplikasi.