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
- 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), dandestroy()(hapus lalu redirect dengan pesan). - Buat view
edit.blade.php: form berisi data produk saat ini, memakai method POST dengan@method('PUT'). - Pastikan tombol Delete di halaman katalog (Lab 3) berupa form POST dengan
@method('DELETE')dan konfirmasi. - 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.