Laravel9 投稿 CRUD機能を作成 〜 投稿の編集と削除の機能を追加していきます。
親記事
Dockerで環境構築して Laravel 9で CRUD 機能を作る
2022年03月15日
Laravel前記事
Laravel9 投稿 CRUD機能を作成 〜 投稿を表示
2023年01月10日
Laravel環境
- macOS
- Laravel v9.0.2
- Docker 20.10.12
投稿を編集
投稿表示ページの上部の編集ボタンを押すと、その投稿の編集ページへ移動します。
public function edit(Post $post)
{
return view('posts.edit', ['post' => $post]);
}
resources/views/posts/edit.blade.php 編集ページビューを作成します。
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('Edit') }}
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<form action="{{ route('posts.update', $post->id) }}" method="POST">
@method('PUT')
@csrf
<div class="bg-white shadow-sm sm:rounded-lg mb-10">
<div class="p-6 flex items-center ">
<button type="submit" class="rounded bg-blue-400 text-white py-2 px-3">{{ __('Submit') }}</button>
</div>
</div>
<div class="bg-white shadow-sm sm:rounded-lg flex flex-col items-center p-6">
<input type="text" class="px-4 my-5 border shadow rounded w-3/4 @error('title') border-red-400 @endif" name="title" placeholder="title" required value="{{ old('title', $post->title) }}">
@error('title')
<span class="text-red-400 my-3">
{{$message}}
</span>
@endif
<input type="hidden" value="{{ auth()->id() }}" name="user_id">
<textarea name="content" class="p-4 my-1 border shadow rounded w-3/4 @error('content') border-red-400 @endif" id="" cols="30" rows="10" required>{{ old('content', $post->content) }}</textarea>
@error('content')
<span class="text-red-400 my-3">
{{$message}}
</span>
@endif
</div>
</form>
</div>
</div>
</x-app-layout>
20, 28: old メソッドの第二引数にデフォルトの値を指定します。
更新を保存する
public function update(Request $request, Post $post)
{
$this->authorize('edit', $post);
$data = $request->validate([
'title' => ['required', 'string', 'max:100'],
'content' => ['required', 'string', 'max:400'],
'user_id' => ['integer', Rule::exists('users', 'id')]
]);
$post->update($data);
return redirect()->route('posts')->with('status', '編集完了');
}
現在認証済みのユーザーと投稿したユーザが一致していないと更新できないようにポリシーを適用させます。3: コントローラー内でポリシーを使うには、authorize メソッドを使います。メソッド名と、Post インスタンスを引数に呼び出します。
4: create と同様にバリデーションを行います。
10: updateメソッドで更新します。
投稿を削除する
PostController の destroy メソッドで 投稿を削除させます。
public function destroy(Post $post)
{
$this->authorize('edit', $post);
$post->delete();
return redirect()->route('posts')->with('status', '削除完了');
}
3: 削除も編集と同じくポリシーでユーザーをチェックして、削除しています。
以上でPost のCRUD (Create, Read, Update, Delete)機能を実装できました。