はじめに
Laravel学習の一環でBreezeを利用した簡単な記事投稿アプリを作成しました。
その際、投稿した本人以外が記事を編集・削除できないようにする機能を実装してみたので、備忘のため記事に残します。
完成イメージ
実装フロー
- ビューに記事の投稿者を確認するロジックを追加
- コントローラーに記事の投稿者を確認するロジックを追加
1. ビューに記事の投稿者を確認するロジックを追加
投稿の編集・削除ボタンが表示される条件として、ログインユーザーがその記事の投稿者であるかどうかを確認するコードを追加します。
@if(Auth::id() === $post->user_id)
<div class="text-right flex">
<a href="{{ route('post.edit', $post)}}" class="flex-1">
<x-primary-button>
編集
</x-primary-button>
</a>
<x-primary-button id="js-delete-button" class="bg-red-700 ml-2 flex-2">
削除
</x-primary-button>
</div>
@endif
2. コントローラーに記事の投稿者を確認するロジックを追加
対象のコントローラーのeditメソッドやdestroyメソッドに、ログインユーザーがその記事の投稿者であるかどうかを確認するコードを追加します。
これにより、他者がURLを直接操作して編集や削除を試みた場合でも、その操作が制限されます。
今回は、ログインユーザーが記事の投稿者でない場合は、投稿一覧画面にリダイレクトして警告を表示するようにしました。
public function edit(Request $request, Post $post)
{
if (Auth::id() !== $post->user_id) {
$request->session()->flash('error', '不正なアクセスです');
return redirect()->route('post.index');
}
return view('post.edit', compact('post'));
}
public function destroy(Request $request, Post $post)
{
if (Auth::id() !== $post->user_id) {
$request->session()->flash('error', '不正なアクセスです');
return redirect()->route('post.index');
}
$post->delete();
$request->session()->flash('message', '削除しました');
return redirect()->route('post.index');
}
おわりに
自分で考えて機能を実装する中で、Laravelの各機能への理解が少しずつ深まってきたように思えます。