LaravelにはPolicyという機能があり、閲覧、編集・削除を行う権限を簡単に設定できます。
Policyを使って、各ユーザーの画面に、自分が投稿したものだけを表示する方法を解説していきます。
Laravel Policyでログインユーザーの投稿だけ表示する方法
今回実施したいこと
- ログインしたユーザーは、フォームから質問ができる
- 投稿一覧画面には、ログインユーザーの質問 (Inquiry) のみ表示させる
手順は次のとおりです。
① ポリシーファイルを作成
php artisan make:policyでポリシーファイルを作ります。
1 |
php artisan make:policy InquiryPolicy --model=Inquiry |
php artisan make:policy ポリシー名 –model=モデル名
このとき、ポリシーの名前は、ポリシーをかけるモデル (Post) と同じ名前にしておきましょう。
同じ名前だと、Laravelがモデルとポリシーの関係を自動で見つけてくれるので手間いらず!
名前を変えると、App/AuthserviceProviderに登録しなきゃいけません。
② ポリシーファイルに記述する
app/Policies に新しくポリシーファイルができています。
今回は閲覧制限をかけるので、public function view に下記の一文を入力します。
1 |
return $user->id==$inquiry->user_id; |
キャプチャしたコードは次の通りです。
コードの意味
user id が inquiryテーブルの user_id と同じ場合のみ、表示をしてください。
user id が inquiryテーブルの user_id と同じ場合のみ、表示をしてください。
③ bladeファイルに記述する
実際に閲覧制限をかけたい部分を次のコードで囲みます。
1 2 3 4 5 |
@if(Auth::user()->can('view', $inquiry)) 閲覧制限をかけたいところ @endif |
なお省略して、次のように書くこともできます。
1 2 3 4 5 |
@can('view', $inquiry) 閲覧制限をかけたいところ @endcan |
foreachで記述した部分に閲覧制限をかけるには、@foreachの後にコードをいれましょう。
実際のコード例は次のとおり。
これで、ログインしたユーザーが投稿した質問のみ表示できるようになります。
作成したポリシーは他の場所でも使えます。
さいごに
policyは使いまわせるし、簡単なので好きです。
なおLaravelには他にもいろいろな制限のかけ方があります。
ミドルウェアを使った方法など、別記事で解説しているので、あわせて参考にしてください。