Proyek kecil: aplikasi catatan · Lesson 15 of 16

Mengubah dan menghapus catatan

Dua method terakhir dari tujuh method standar. Ada satu trik kecil soal formulir HTML yang perlu kamu tahu.

3 min 0 comments

Contents

Tiga route lagi, dan aplikasinya lengkap. Tambahkan di routes/web.php:

Route::get('/catatan/{note}/ubah', [NoteController::class, 'edit'])->name('catatan.edit');
Route::put('/catatan/{note}', [NoteController::class, 'update'])->name('catatan.update');
Route::delete('/catatan/{note}', [NoteController::class, 'destroy'])->name('catatan.destroy');

Formulir ubah

Method edit mirip show, hanya view-nya berbeda:

public function edit(Note $note)
{
    return view('notes.edit', ['note' => $note]);
}

File resources/views/notes/edit.blade.php hampir sama dengan formulir tambah, dengan dua perbedaan yang saya tandai di komentar:

<x-layout title="Ubah catatan">
    <h1>Ubah catatan</h1>

    <form method="post" action="{{ route('catatan.update', $note) }}">
        @csrf
        @method('put') {{-- beda 1: formulir HTML hanya bisa GET dan POST, jadi PUT "dititipkan" lewat sini --}}

        <label>Judul
            <input type="text" name="title" value="{{ old('title', $note->title) }}"> {{-- beda 2: nilai awalnya dari catatan --}}
        </label>
        @error('title') <p>{{ $message }}</p> @enderror

        <label>Isi
            <textarea name="body">{{ old('body', $note->body) }}</textarea>
        </label>
        @error('body') <p>{{ $message }}</p> @enderror

        <button>Simpan perubahan</button>
    </form>
</x-layout>

old('title', $note->title) berarti: pakai isian lama kalau formulir baru saja ditolak, kalau tidak pakai judul catatan saat ini.

Menyimpan perubahan

public function update(Request $request, Note $note)
{
    $data = $request->validate([
        'title' => ['required', 'max:100'],
        'body' => ['required'],
    ]);

    $note->update($data);

    return redirect()->route('catatan.show', $note)->with('status', 'Perubahan tersimpan.');
}

Validasinya sama persis dengan store. Kalau kamu merasa itu pengulangan, instingmu benar; Laravel punya form request untuk menaruh aturan validasi di satu class. Untuk sekarang, pengulangan dua kali masih wajar.

Menghapus

Menghapus tidak boleh lewat tautan biasa, karena tautan bisa dibuka tanpa sengaja (atau oleh mesin pencari). Pakai formulir kecil dengan tombol. Di notes/show.blade.php, tambahkan:

<a href="{{ route('catatan.edit', $note) }}">Ubah</a>

<form method="post" action="{{ route('catatan.destroy', $note) }}" onsubmit="return confirm('Hapus catatan ini?')">
    @csrf
    @method('delete')
    <button>Hapus</button>
</form>

Dan method terakhirnya:

public function destroy(Note $note)
{
    $note->delete();

    return redirect()->route('catatan.index')->with('status', 'Catatan dihapus.');
}

Coba semuanya: ubah sebuah catatan, lihat pesannya, lalu hapus. Kalau kamu menjalankan php artisan route:list sekarang, ada tujuh route catatan.*: persis tujuh method standar yang kita bahas di bab 3.

Jalan pintasnya

Setelah kamu paham ketujuh route itu, ada cara menulisnya dalam satu baris:

Route::resource('catatan', NoteController::class)->parameters(['catatan' => 'note']);

Ini mendaftarkan ketujuh route dengan nama dan method standar. Saya sengaja menyimpannya di akhir: jalan pintas enak dipakai kalau kamu tahu apa yang ia singkat.

Discussion

Log in to join the conversation. Log in

No discussion here yet. Be the first to ask.