> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-8-fitur-update-and-delete/8.4-penjelasan-method-put-and-delete.md).

# 8.4 Penjelasan Method PUT & DELETE

## Penjelasan method PUT & DELETE

Di subbab 8.2 dan 8.3, Anda sudah memakai `@method('PUT')` dan `@method('DELETE')`.

Sekarang kita pahami kenapa bagian itu diperlukan.

Banyak siswa bisa menyalin baris tersebut.

Tetapi belum tentu paham alasan teknisnya.

### Teori awal dan analogi

Bayangkan Anda mengirim surat ke kantor administrasi.

Amplopnya bisa sama.

Tetapi isi perintah di dalamnya bisa berbeda.

Satu surat berisi permintaan memperbarui data.

Surat lain berisi permintaan menghapus data.

Di Laravel, bentuk form HTML-nya memang tetap mirip.

Tetapi jenis aksi yang diminta bisa dibedakan lewat method request.

### Masalah dasarnya ada di HTML

Secara bawaan, HTML form hanya mendukung dua method utama:

* `GET`
* `POST`

Padahal dalam konsep CRUD dan HTTP, kita juga mengenal:

* `PUT` untuk update
* `DELETE` untuk hapus

Nah, di sinilah Laravel membantu.

Laravel memakai teknik yang sering disebut **method spoofing**.

### Apa itu method spoofing

Method spoofing adalah cara Laravel menyamarkan request `POST` agar dibaca sebagai method lain.

Contohnya:

```blade
@csrf
@method('PUT')
```

atau:

```blade
@csrf
@method('DELETE')
```

Di browser, form tetap dikirim sebagai `POST`.

Tetapi Laravel membaca penanda tambahan itu lalu memperlakukannya sebagai `PUT` atau `DELETE`.

### Kenapa ini penting pada resource controller

Kalau Anda memakai:

```php
Route::resource('buku', BukuController::class);
```

Laravel otomatis membuat route yang berbeda untuk tiap aksi.

Contohnya:

* `GET /buku` untuk daftar data
* `GET /buku/{id}/edit` untuk form edit
* `PUT /buku/{id}` untuk update data
* `DELETE /buku/{id}` untuk hapus data

Artinya, Laravel bukan hanya melihat URL.

Laravel juga melihat **method request**.

### Langkah praktik kecil untuk memahami alurnya

Ikuti alur ini sambil melihat kode Anda.

{% stepper %}
{% step %}

### Periksa form edit

Buka file:

`resources/views/buku/edit.blade.php`

Pastikan bagian form Anda mirip seperti ini:

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

Di sini browser tetap mengirim `POST`, tetapi Laravel akan membacanya sebagai `PUT`.
{% endstep %}

{% step %}

### Periksa form hapus

Buka file:

`resources/views/buku/index.blade.php`

Pastikan tombol hapus memakai pola seperti ini:

```blade
<form action="{{ route('buku.destroy', $buku->id) }}" method="POST">
    @csrf
    @method('DELETE')
    <button type="submit">Hapus</button>
</form>
```

Di sini Laravel akan membacanya sebagai request `DELETE`.
{% endstep %}

{% step %}

### Hubungkan dengan controller

Sekarang lihat method di `BukuController`:

```php
public function update(Request $request, $id)
```

dan:

```php
public function destroy($id)
```

Method pertama dipanggil saat request dibaca sebagai `PUT`.

Method kedua dipanggil saat request dibaca sebagai `DELETE`.
{% endstep %}
{% endstepper %}

### Penjelasan pasca-praktik

Sekarang mari kita simpulkan alurnya.

#### 1. Kenapa tidak cukup pakai `POST` biasa

Kalau semua aksi dikirim sebagai `POST` tanpa pembeda, route akan sulit membedakan maksud request.

Apakah request itu untuk menambah data.

Atau memperbarui.

Atau menghapus.

Karena itu, Laravel butuh penanda tambahan.

#### 2. `@method('PUT')`

Directive ini dipakai untuk update data.

Biasanya dipasangkan pada form edit.

Jadi saat pengguna klik **Update**, Laravel tahu bahwa request itu harus diarahkan ke method `update()`.

#### 3. `@method('DELETE')`

Directive ini dipakai untuk hapus data.

Jadi saat tombol **Hapus** ditekan, Laravel tahu bahwa request itu harus diarahkan ke method `destroy()`.

#### 4. Hubungan dengan route resource

Resource controller bekerja seperti peta otomatis.

Setiap kombinasi URL dan method request akan diarahkan ke method controller yang berbeda.

Inilah alasan kenapa satu route resource bisa menangani banyak aksi CRUD sekaligus.

### Ringkasan cepat

Supaya mudah diingat:

* `POST` biasanya untuk create
* `PUT` biasanya untuk update
* `DELETE` biasanya untuk hapus

Di Laravel Blade:

* update memakai `@method('PUT')`
* hapus memakai `@method('DELETE')`

### Troubleshooting yang paling sering

Masalah yang paling sering muncul:

* **route update tidak jalan** — `@method('PUT')` belum ada
* **route delete tidak jalan** — `@method('DELETE')` belum ada
* **semua request terasa seperti POST biasa** — method spoofing belum dipasang
* **bingung kenapa URL sama tetapi aksi beda** — lupa bahwa method request juga ikut menentukan

{% hint style="warning" %}
Jangan hanya melihat URL saat debugging route resource. Cek juga method request yang dikirim oleh form.
{% endhint %}

{% hint style="info" %}
Kalau ingin memahami resource controller dengan baik, biasakan berpikir bahwa URL dan method request selalu bekerja berpasangan.
{% endhint %}

### Poin evaluasi bab 8.4

Pastikan Anda sudah memahami poin berikut:

* Saya tahu HTML form asli hanya mengenal `GET` dan `POST`.
* Saya paham Laravel memakai method spoofing untuk `PUT` dan `DELETE`.
* Saya tahu `@method('PUT')` dipakai untuk update.
* Saya tahu `@method('DELETE')` dipakai untuk hapus.
* Saya paham route resource membaca URL dan method request sekaligus.

Jika semuanya sudah jelas, lanjut ke [8.5 Tantangan: CRUD Tabel Kategori](/laravel/bab-8-fitur-update-and-delete/8.5-tantangan-crud-tabel-kategori.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-8-fitur-update-and-delete/8.4-penjelasan-method-put-and-delete.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
