Laravelにてアプリ開発を行う際、特定の人にしか操作させたくないページがあるとおもいます。
(ブログフォーマットの開発であれば、管理者以外はブログ作成画面へ飛ばないようにする場面などです)
基本的にmiddlewareを使えば認証システムはほとんど問題ありません。
Route::put('/tasks/{id}', [TaskBoardController::class, 'updateTask'])->middleware('auth:sanctum');
ですが時には複雑な条件を付けたい場合などもあるでしょう。
(タスク管理アプリを開発するのであれば、タスクを作成した者以外は閲覧はできるが編集ができないという場合などです)
その場合はLaravelのPolicyを使うと便利です。
Policyの使い方
作成コマンドと命名規則
php artisan make:policy CategoryPolicy --model=Category
後述しますがポリシーファイルの名前によっては、コントローラーで呼び出しをせずとも自動で判別してくれます。
Categoryというmodelに対応させたいのであればCategoryPolicyと命名しましょう。
また、モデルを使用することで雛形を形成してくれます。
Policyファイルのサンプルコード
<?php
namespace App\Policies;
use App\Models\Category;
use App\Models\User;
class CategoryPolicy
{
/**
* Determine whether the user can view any models.
*/
public function viewAny(User $user): bool
{
return $user->admin === 1;
}
// ============ 中略 ==============
}
ポリシーは真偽判定であるため、式を書きます。
今回はUserモデルにadmin(Int)カラムがあることを前提としています。
Controllerでの使い方
<?php
namespace App\Http\Controllers\CMS;
use App\Http\Resources\CategoryResource;
use App\Models\Category;
use Illuminate\Http\Request;
use App\Http\Requests\StoreCategoryRequest;
use App\Http\Controllers\Controller;
class CategoryController extends Controller
{
/**
* Store a newly created resource in storage.
*/
public function store(StoreCategoryRequest $request)
{
$this->authorize('create', Category::class);
$category = Category::create([
'category_name' => $request->name,
'project_id' => $request->project_id
]);
return new CategoryResource($category);
}
$this->authorize($a, $b)では、
$a = アビリティ(権限) $b = 引数(呼び出しもとから渡されたもの)という使い方をします。
簡単にいうと$bは$aをすることができるかということです。