はじめての方へ・ステップ 11 / 12
編集と削除をできるようにする
保存したメモを直す(編集・更新)と、メモを消す(削除)をできるようにして、メモ帳アプリを仕上げます。HTML のフォームで PUT と DELETE を送る @method の使い方も説明します。
最後に、保存したメモを直したり、消したりできるようにします。これで、一覧・作成・表示・編集・削除がそろい、メモ帳アプリのできあがりです。使うのは、MemoController に残っている edit・update・destroy の3つのメソッドです。
編集のフォームを作る(edit)#
edit メソッドで、編集のフォームのビューを返します。
public function edit(Memo $memo)
{
return view('memos.edit', ['memo' => $memo]);
}
show と同じく、Memo $memo には URL の番号のメモが自動で入ります(ルートモデル結合)。
resources/views/memos/edit.blade.php を作ります。作成のフォームとよく似ています。
<x-layout>
<x-slot:title>メモを直す</x-slot>
<h1>メモを直す</h1>
<form method="POST" action="{{ route('memos.update', $memo) }}">
@csrf
@method('PUT')
<p>
<label for="title">タイトル</label><br>
<input type="text" id="title" name="title" value="{{ old('title', $memo->title) }}">
</p>
@error('title')
<p>{{ $message }}</p>
@enderror
<p>
<label for="body">本文</label><br>
<textarea id="body" name="body" rows="5">{{ old('body', $memo->body) }}</textarea>
</p>
@error('body')
<p>{{ $message }}</p>
@enderror
<button type="submit">直した内容を保存する</button>
</form>
<p><a href="{{ route('memos.show', $memo) }}">メモへ戻る</a></p>
</x-layout>
作成のフォームとちがうところは3つです。
- 送り先:
route('memos.update', $memo)で、/memos/1のような、そのメモの URL へ送ります @method('PUT'):HTML のフォームはGETとPOSTしか送れません。そこで、POSTで送りつつ「本当はPUT(更新)です」という印を隠れた入力欄に入れます。Laravel はこの印を見て、updateメソッドに任せますold('title', $memo->title):2つ目の値は、「戻ってきた入力が無いときに出す値」です。最初に開いたときは、いまのメモのタイトルが入ります
直して保存する(update)#
update メソッドを書きます。チェックのしかたは store と同じです。
public function update(Request $request, Memo $memo)
{
$validated = $request->validate([
'title' => ['required', 'max:100'],
'body' => ['nullable', 'max:2000'],
]);
// チェックを通った値で、いまのメモを書きかえて保存する
$memo->update($validated);
return redirect()->route('memos.show', $memo)->with('status', 'メモを直しました。');
}
$memo->update($validated) は、配列の値でメモを書きかえて、そのまま保存します。updated_at(最後に変えた日時)も自動で新しくなります。
メモを消す(destroy)#
destroy メソッドを書きます。
public function destroy(Memo $memo)
{
$memo->delete();
return redirect()->route('memos.index')->with('status', 'メモを消しました。');
}
消すときも、リンクではなくフォームで送ります。リンク(GET)は、ブラウザや検索エンジンが勝手に開くことがあるので、データを変える操作には使いません。
表示のページにボタンを置く#
resources/views/memos/show.blade.php の「一覧へ戻る」の上に、編集へのリンクと、削除のフォームを足します。
<p><a href="{{ route('memos.edit', $memo) }}">このメモを直す</a></p>
<form method="POST" action="{{ route('memos.destroy', $memo) }}">
@csrf
@method('DELETE')
<button type="submit" onclick="return confirm('このメモを消しますか?')">このメモを消す</button>
</form>
<p><a href="{{ route('memos.index') }}">一覧へ戻る</a></p>
@method('DELETE')で、「本当はDELETE(削除)です」という印を入れます。Laravel はdestroyメソッドに任せますonclick="return confirm('…')"は、押したときに確かめの小さな窓を出す JavaScript です。「キャンセル」を押すと送られません。うっかり消すのを防ぎます
試してみる#
- 一覧からメモを開き、「このメモを直す」を押す → いまの内容が入ったフォームが出る
- タイトルを書きかえて保存する → メモの表示のページに戻り、「メモを直しました。」と出る
- 「このメモを消す」を押し、確かめの窓で OK を押す → 一覧に戻り、「メモを消しました。」と出て、そのメモが消えている
注意
@method('PUT') や @method('DELETE') を書き忘れると、フォームは POST のまま送られます。すると「The POST method is not supported for route memos/1.」(この URL では POST は使えない)というエラーになります。
できあがったメモ帳アプリ#
おつかれさまでした。これでメモ帳アプリの完成です。作ったものを、もう一度ながめてみましょう。
| 作ったもの | 場所 |
|---|---|
| メモの表の手順書 | database/migrations/…_create_memos_table.php |
| メモのモデル | app/Models/Memo.php |
| メモのコントローラー | app/Http/Controllers/MemoController.php |
| ルート | routes/web.php(Route::resource('memos', MemoController::class);) |
| 共通の枠 | resources/views/components/layout.blade.php |
| 一覧・作成・表示・編集の画面 | resources/views/memos/ の index・create・show・edit |
ここまでで使った「ルート → コントローラー → モデル → ビュー」の流れは、どんなに大きな Laravel のアプリでも同じです。掲示板なら「メモ」を「投稿」に、ToDo リストなら「やること」に置きかえれば、同じ手順で作れます。
次に読むページ#
公式ドキュメント(英語)
2026年10月5日時点の内容をもとに、日本語でまとめています。