Laravel 13 Pemula #11: Menghapus yang Tidak Perlu (Delete) – Tombol Hapus dengan Peringatan

Tutorial Laravel 13 Pemula • Proyek Web Berita

#11: Menghapus yang Tidak Perlu (Delete) – Tombol Hapus dengan Peringatan

Halo, Petugas Kebersihan Data!

Kadang ada kategori yang tidak terpakai atau salah buat. Kita perlu menghapusnya. Tapi hati-hati, jangan sampai salah hapus! Di tutorial ini, kita akan membuat fitur Delete (Hapus) dengan kotak peringatan (konfirmasi) yang bertanya, "Yakin mau hapus?" sebelum benar-benar menghapus dari database. Ini adalah bagian terakhir dari CRUD (Create, Read, Update, Delete). Setelah ini, CRUD kategori kita lengkap!

Tujuan Kita:
  1. Membuat method destroy() di CategoryController untuk menghapus data.
  2. Menambahkan rute DELETE untuk menghapus kategori.
  3. Menambahkan tombol "Hapus" di setiap baris tabel kategori.
  4. Memberi konfirmasi JavaScript sebelum menghapus (agar tidak kebablasan).
  5. Menampilkan pesan sukses setelah data terhapus.

Peringatan Penting Sebelum Menghapus

Perhatian! Di proyek kita nanti, tabel berita (news) akan terhubung ke kategori. Jika kita menghapus kategori yang masih dipakai oleh berita, bisa terjadi masalah (relasi putus). Untuk sementara, kita akan menghapus kategori saja. Nanti di fitur berita, kita akan mengatur agar jika kategori dihapus, beritanya juga ikut terhapus atau setidaknya tidak error. Tapi untuk latihan kali ini, pastikan kategori yang kamu hapus tidak sedang dipakai berita (karena kita belum punya berita). Aman!

Langkah 1: Menambahkan Method Destroy di Controller

Update CategoryController.php

Buka app/Http/Controllers/CategoryController.php. Tambahkan method destroy() di bagian bawah (setelah method update()).

// Menghapus kategori dari database
public function destroy($id)
{
    // Cari kategori berdasarkan ID
    $category = Category::findOrFail($id);
    
    // Hapus data
    $category->delete();
    
    // Redirect ke halaman daftar kategori dengan pesan sukses
    return redirect()->route('kategori.index')->with('success', 'Kategori "' . $category->name . '" berhasil dihapus!');
}

Penjelasan:

  • findOrFail($id) → mencari kategori. Jika tidak ada, tampilkan error 404.
  • $category->delete() → perintah ajaib untuk menghapus data dari database.
  • Pesan sukses menyertakan nama kategori yang dihapus agar lebih jelas.
Catatan: Jika nanti kita ingin menggunakan Soft Delete (data tidak hilang permanen, hanya ditandai terhapus), kita bisa menambahkan use SoftDeletes di model. Tapi untuk pemula, hapus permanen dulu lebih sederhana.

Langkah 2: Menambahkan Rute DELETE

Update routes/web.php

Buka routes/web.php. Tambahkan rute untuk menghapus kategori. Gunakan method delete. Letakkan setelah rute update.

use App\Http\Controllers\CategoryController;

Route::get('/kategori', [CategoryController::class, 'index'])->name('kategori.index');
Route::get('/kategori/create', [CategoryController::class, 'create'])->name('kategori.create');
Route::post('/kategori', [CategoryController::class, 'store'])->name('kategori.store');
Route::get('/kategori/{id}/edit', [CategoryController::class, 'edit'])->name('kategori.edit');
Route::put('/kategori/{id}', [CategoryController::class, 'update'])->name('kategori.update');

// Rute untuk menghapus kategori
Route::delete('/kategori/{id}', [CategoryController::class, 'destroy'])->name('kategori.destroy');

Penjelasan: Route::delete karena kita akan mengirim request DELETE. Di dalam form nanti kita akan menggunakan @method('DELETE').

Langkah 3: Menambahkan Tombol Hapus di Tabel

Edit kategori.blade.php – Tambah Tombol Hapus

Buka resources/views/kategori.blade.php. Cari kolom "Aksi". Kita akan tambahkan tombol hapus di samping tombol edit. Ubah bagian tersebut menjadi:

<td>
    <a href="{{ route('kategori.edit', $category->id) }}" style="background: #ffc107; color: #333; padding: 4px 10px; text-decoration: none; border-radius: 4px; margin-right: 5px;">Edit</a>
    
    <form action="{{ route('kategori.destroy', $category->id) }}" method="POST" style="display: inline-block;">
        @csrf
        @method('DELETE')
        <button type="submit" onclick="return confirm('Yakin ingin menghapus kategori "{{ $category->name }}"?')" style="background: #dc3545; color: white; border: none; padding: 4px 10px; border-radius: 4px; cursor: pointer;">Hapus</button>
    </form>
</td>

Penjelasan penting:

  • Kita menggunakan <form> dengan method POST, tapi di dalamnya ada @method('DELETE') agar Laravel membaca sebagai request DELETE.
  • @csrf wajib untuk keamanan.
  • onclick="return confirm('...')" → ini adalah kotak peringatan bawaan JavaScript. Jika pengguna klik "OK", form akan dikirim. Jika "Batal", tidak jadi hapus.
  • Pesan konfirmasi menampilkan nama kategori yang akan dihapus agar lebih jelas.
Tips Keamanan: Konfirmasi JavaScript hanya untuk mencegah klik tidak sengaja. Di aplikasi sungguhan, sebaiknya tambahkan juga proteksi di server (misalnya menggunakan otorisasi), tapi untuk pemula ini sudah cukup.

Langkah 4: Uji Coba Hapus

Pastikan server Laravel berjalan. Buka http://localhost:8000/kategori. Sekarang setiap baris kategori memiliki tombol Hapus berwarna merah. Coba klik tombol Hapus pada salah satu kategori.

Maka akan muncul kotak peringatan: "Yakin ingin menghapus kategori Teknologi?". Klik OK. Data akan langsung terhapus dari database, dan kamu akan diarahkan kembali ke halaman daftar kategori dengan pesan sukses: "Kategori Teknologi berhasil dihapus!".

Coba juga klik Hapus lalu klik Batal – data tidak akan terhapus. Bagus, kan?

Langkah Opsional: Menambahkan Pesan Konfirmasi dengan Nama Kategori Dinamis

Pada kode di atas, kita menulis return confirm('... "{{ $category->name }}"?'). Perhatikan bahwa kita menggunakan tanda petik ganda dan tunggal dengan hati-hati. Jika nama kategori mengandung tanda petik, bisa error. Untuk amannya, gunakan addslashes atau lebih baik menggunakan pendekatan data attribute. Tapi untuk pemula dan nama kategori sederhana (tanpa petik), itu sudah cukup. Alternatif yang lebih aman:

<button type="submit" onclick="return confirm('Yakin hapus kategori ' + '{{ addslashes($category->name) }}' + '?')" ...>

Atau bisa juga menggunakan data-nama dan JavaScript, tapi itu lebih kompleks. Untuk sekarang, kode pertama sudah oke.

Ringkasan CRUD Kategori (Lengkap!)

Selamat! Sekarang kita sudah menyelesaikan semua operasi CRUD untuk fitur kategori:

  • Create – Menambah kategori (tutorial #8).
  • Read – Menampilkan daftar kategori (tutorial #9).
  • Update – Mengedit kategori (tutorial #10).
  • Delete – Menghapus kategori (tutorial #11).

Kita juga sudah belajar tentang validasi, paginasi, pencarian, routing, controller, model, view, dan konfirmasi hapus. Luar biasa!

Apa Selanjutnya?

Sekarang kita akan beralih ke fitur utama: Mengelola Berita (News). Kita akan membuat tabel berita, model, controller, dan CRUD untuk berita. Berita akan memiliki gambar, isi konten, dan terhubung ke kategori. Ini akan lebih seru! Setelah itu, kita akan membuat halaman depan situs berita yang bisa dibaca oleh pengunjung.

Jangan lupa untuk terus mempraktikkan. Jika ada error, baca pesan errornya dengan teliti – itu adalah teman terbaik programmer.

Pencapaian Besar! Kamu sudah berhasil membuat fitur CRUD kategori yang lengkap. Ini adalah fondasi yang kuat untuk melanjutkan ke fitur berita. Beri tepuk tangan untuk dirimu sendiri!

Seri Tutorial Laravel 13 Pemula – Proyek Web Berita
Selanjutnya: #12: Membuat Tabel Berita – Migration news (title, slug, content, image, category_id)

Lebih baru Lebih lama

نموذج الاتصال