WebTech Interaktif XI RPL

Laravel · Bab 9

Lab 6: UPDATE, DELETE & Method Spoofing

Melengkapi CRUD produk dengan form ubah dan tombol hapus memakai route model binding, validasi unik yang mengabaikan data sendiri, dan method spoofing PUT/DELETE.

Di lab ini CRUD produk menjadi lengkap: data bisa diubah dan dihapus. Tantangannya ada di HTML — form hanya mengenal method GET dan POST, sedangkan rute resource memakai PUT dan DELETE. Contoh kode memakai studi kasus perpustakaan (books); terapkan polanya ke produk.

Alur Langkah

  1. Di controller produk, lengkapi show() (cukup redirect ke halaman edit), edit() (kirim produk dan semua kategori ke view), update() (validasi seperti Lab 4, tetapi aturan unik kode produk mengabaikan ID produk itu sendiri, lalu simpan perubahan dan redirect dengan pesan), dan destroy() (hapus lalu redirect dengan pesan).
  2. Buat view edit.blade.php: form berisi data produk saat ini, memakai method POST dengan @method('PUT').
  3. Pastikan tombol Delete di halaman katalog (Lab 3) berupa form POST dengan @method('DELETE') dan konfirmasi.
  4. Uji ubah harga tanpa mengubah kode produk, lalu uji hapus produk.

Route Model Binding

Pada rute resource, URI /books/{book} membawa ID buku. Jika parameter method diberi tipe Model, Laravel otomatis mencari datanya — inilah Route Model Binding:

public function edit(Book $book)
{
    $authors = Author::all();
    return view('books.edit', compact('book', 'authors'));
}

Membuka /books/7/edit otomatis mengisi $book dengan buku ber-ID 7, atau menampilkan 404 bila tidak ada. Di aplikasi ini, method show(Book $book) cukup mengarahkan ke halaman edit dengan redirect()->route(...).

Update dengan Aturan unique yang Mengabaikan ID

Aturan unique biasa akan menolak saat kamu menyimpan ulang buku dengan ISBN yang sama — karena ISBN itu sudah “dipakai” oleh buku itu sendiri. Tambahkan ID data yang sedang diedit sebagai pengecualian:

public function update(Request $request, Book $book)
{
    $validated = $request->validate([
        'isbn'  => 'required|max:13|unique:books,isbn,' . $book->id,
        'title' => 'required|min:3|max:100',
    ]);

    $book->update($validated);

    return redirect()->route('books.index')->with('success', 'Data buku berhasil diperbarui!');
}

Format unique:tabel,kolom,<id> berarti “unik, kecuali baris dengan ID ini”.

Hapus Data

public function destroy(Book $book)
{
    $book->delete();
    return redirect()->route('books.index')->with('success', 'Buku berhasil dihapus!');
}

Ingat onDelete('cascade') dari Lab 2: menghapus data induk ikut menghapus baris anak yang terhubung.

Method Spoofing: @method(‘PUT’) & @method(‘DELETE’)

Form HTML hanya bisa mengirim GET atau POST. Agar rute update (PUT) dan destroy (DELETE) bisa dipanggil, form dikirim sebagai POST lalu method aslinya “dipalsukan” dengan direktif @method — teknik ini disebut Method Spoofing. Laravel membaca field tersembunyi _method yang dihasilkannya.

Form ubah:

<form action="{{ route('books.update', $book->id) }}" method="POST">
    @csrf
    @method('PUT')

    <input type="text" name="title" class="form-control"
           value="{{ old('title', $book->title) }}">
    ...
</form>

old('title', $book->title) menampilkan input terakhir bila validasi gagal, atau data dari database bila form baru dibuka.

Tombol hapus di halaman katalog:

<form action="{{ route('books.destroy', $item->id) }}" method="POST"
      onsubmit="return confirm('Yakin ingin menghapus buku ini?')">
    @csrf
    @method('DELETE')
    <button type="submit" class="btn btn-outline-danger">Delete</button>
</form>

Hasil yang Diharapkan

Mengubah harga tanpa mengganti kode produk berhasil dan kembali ke katalog dengan pesan hijau. Tombol Delete meminta konfirmasi, lalu menghapus produk dari katalog tanpa galat 405.