Lompat ke isi
Les Laravel DocsTutorial Les Privat · Laravel CRUD
Unduh Starter Pack
Sesi 4: Delete & Uji MerusakEstimasi: 30 menit5 titik periksa

Bab 8 — Delete: Menghapus Data Siswa

8.1Konsep

Menghapus itu satu method

Teks
destroy(Siswa $siswa)  → hapus siswa itu, kembali ke daftar   (DELETE /siswa/5)

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()

app/Http/Controllers/SiswaController.phpPHP
    public function destroy(Siswa $siswa)    {        $siswa->delete();        return redirect()->route('siswa.index')            ->with('success', 'Data siswa berhasil dihapus!');    }

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

  1. Klik Hapus pada satu siswa, lalu pilih Batal di kotak konfirmasi. Data tetap ada.
  2. Klik Hapus lagi, pilih OK. Siswa hilang dan muncul pesan hijau Data siswa berhasil dihapus!. Siswa lain tidak berubah.
  3. Hapus semua siswa satu per satu. Muncul tulisan Belum ada data siswa. Isi lagi dengan php artisan db:seed --class=SiswaSeeder.

8.6Jalankan test

PowerShell
php artisan test --filter=HapusSiswaTest

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/1 lewat alamat tidak menghapus apa pun.
  • php artisan test --filter=HapusSiswaTest → 5 test hijau.
  • Sekarang aplikasi punya empat fitur: daftar, tambah, ubah, hapus.

Pertanyaan pemahaman

  1. Kenapa tombol Hapus dibuat sebagai formulir POST + @method('DELETE'), bukan tautan <a href>?
  2. Apa yang dilakukan confirm() ketika pengguna menekan Batal?
  3. Kenapa ada test khusus "hanya siswa yang dipilih yang terhapus"? Bug apa yang dilindunginya?
  4. Setelah delete(), kenapa kita redirect dan 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.

Tutorial Data Siswa Les — Laravel CRUD untuk les privat.

Kode boleh disalin, tapi coba ketik sendiri dulu: tangan yang mengetik lebih cepat paham.