0
0

投稿アプリで本人以外が記事を削除できなくする (Laravel)

Posted at

はじめに

Laravel学習の一環でBreezeを利用した簡単な記事投稿アプリを作成しました。
その際、投稿した本人以外が記事を編集・削除できないようにする機能を実装してみたので、備忘のため記事に残します。

完成イメージ

投稿した本人の場合 → 編集・削除ボタンが表示される
スクリーンショット 2024-09-01 19.17.44.png

投稿した本人以外の場合 → ボタンが表示されない
スクリーンショット 2024-09-01 19.19.03.png

実装フロー

  1. ビューに記事の投稿者を確認するロジックを追加
  2. コントローラーに記事の投稿者を確認するロジックを追加

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の各機能への理解が少しずつ深まってきたように思えます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0