LaravelでAjax POST処理のPolicyを作っていきます。今回は、Ajaxの詳細には触れていきません。
Userが、AjaxでCommentの編集をすることを想定した流れとなっています。
①:Policy作成の流れ
①-1:Policyの作成
$ php artisan make:policy CommentPolicy
App\Policiesの配下にCommentPolicy.php が作成される。
①-2:Policyを登録
App\Providers\AuthServiceProvider
protected $policies = []に 作成したPolicyを登録
protected $policies = [ Comment::class => CommentPolicy::class, ];
①-3:Policyのメソッド記述 (True OR Falseを返す)
実際のPolicyの処理を書いていきます。
①-1:Policyの作成 で作成した CommentPolicy.php に処理を記述していきます。
App\Policies\CommentPolicy.php
<?php namespace App\Policies; use App\Models\User; use App\Models\Comment; use Illuminate\Auth\Access\HandlesAuthorization; class CommentPolicy { use HandlesAuthorization; /** * Create a new policy instance. * * @return void */ public function __construct() { // } public function update(User $user, Comment $comment) { return $user->id === $comment->user_id; } }
メソッドの内容としては、非常にシンプルかと思います。
Userのid と commentのuser_idが
・同じ場合はTrueを返し、
・違う場合はFalseを返します。
①-4:Policyの呼び出し
任意のコントローラーにて、①-3:Policyのメソッド記述 で作成したupdateメソッドを呼び出します。
詳細は 「②:AjaxでPolicyを呼び出し/認可」 以降にて記述していきます。
②:AjaxでPolicyを呼び出し/認可
commentの編集をするメソッドに、認可の処理を追加していきます。
CommentController の edit メソッド で実行していきます。
前提として
・ $requestにcomment_idを含めている
・ $requestにinput_textでコメントが含まれている
・ JSに $commentで返す
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use App\Models\Comment; use App\Models\User; class CommentController extends Controller { public function edit(Request $request) { // comment_idから編集予定のComment modelを取得 $comment = Comment::where('id', $request->comment_id)->get()->first(); // 編集処理をするUserの取得 $user = Auth::user(); // 編集User と 編集予定のCommentを作成したUserが 同一なのかを認可 if($user->can('update',$comment)){ $comment->comment = $request->input_text; $comment->save(); // JSに$commentを返す。 return $comment; } else { abort(403); } } }
③:Ajaxの処理で躓いたところ
正直、上記の処理は、Ajax関係なくない??と思うかと思います。
確かに、上記の処理であれば、Ajax関係ない処理として通用します。
私は、authorize() メソッドを利用した際に躓きました。
authorizeメソッドでは、 Userのインスタンスを渡す必要が無く、自動的に読み込んでくれています。
ここが、AjaxだとUserインスタンスが自動で読み込まれません。