Policy:モデルベースの認可
EloquentモデルにPolicyを関連付け、コントローラーで利用します
「Policy:モデルベースの認可」はCoddyKit上の無料PHP Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPHP Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 PHP Academyコースには全4レッスンが含まれています。
Policyとは
Policyは、特定のEloquentモデルに対する認可ロジックをまとめるクラスです。同じモデルに対して複数の認可アクションがある場合に推奨されます。
Policyの生成
Artisanを使用してPolicyを生成します。--modelを追加すると、標準的なメソッドがあらかじめ入力されます。
$ php artisan make:policy PostPolicy --model=PostPolicyのメソッド
各メソッドは1つのアクションに対応します。認証済みユーザーとモデルのインスタンスを受け取ります。
<?php
class PostPolicy
{
public function view(?User $user, Post $post): bool
{
return $post->is_published || $user?->id === $post->user_id;
}
public function update(User $user, Post $post): bool
{
return $user->id === $post->user_id;
}
public function delete(User $user, Post $post): bool
{
return $user->id === $post->user_id || $user->isAdmin();
}
}Policyの登録
Laravel 11以降では、命名規則(Postモデル → PostPolicy)に従っていれば、Policyが自動検出されます。AuthServiceProviderで手動登録することもできます。
コントローラーでのPolicyの使用
$this->authorize("action", $model)を呼び出すと、Laravelが対応するPolicyを自動的に見つけます。
<?php
public function update(Request $request, Post $post): RedirectResponse
{
$this->authorize("update", $post);
$post->update($request->validated());
return redirect()->route("posts.show", $post);
}BladeでのPolicy
@canディレクティブは、Gateの場合と同じようにPolicyでも使用できます。
@can('update', $post)
<a href="/posts/{{ $post->id }}/edit">Edit</a>
@endcanbefore()メソッド
Policyに任意で定義できるbefore()メソッドは、他のメソッドより先に実行されます。trueを返すと、無条件のアクセス権を与えられます(管理者などに使用します)。
<?php
public function before(User $user, string $ability): ?bool
{
if ($user->isAdmin()) return true;
return null; // continue to specific method
}createアクション(モデルインスタンスなし)
create Policyメソッドが受け取るのはユーザーだけです。まだモデルのインスタンスが存在しないためです。
<?php
public function create(User $user): bool
{
return $user->hasVerifiedEmail();
}Policyの手動チェック
Gateファサードまたはユーザーモデルを使用して、Policyを直接チェックします。
<?php
Gate::allows("update", $post); // true/false
$user->can("update", $post); // true/false
$user->cannot("delete", $post); // true/falsePolicyのレスポンス
PolicyメソッドからResponseオブジェクトを返すと、拒否メッセージをカスタマイズできます。
<?php
use Illuminate\Auth\Access\Response;
public function publish(User $user, Post $post): Response
{
return $user->isEditor()
? Response::allow()
: Response::deny("Only editors can publish posts.");
}Policyのテスト
PHPUnitで特定のユーザーとして操作し、Policyをテストします。
<?php
public function test_owner_can_delete_post(): void
{
$user = User::factory()->create();
$post = Post::factory()->create(["user_id" => $user->id]);
$this->assertTrue($user->can("delete", $post));
}概要
Policyはモデルレベルの認可をまとめます。make:policy --modelで生成し、コントローラーでは$this->authorize()、Bladeでは@canを使用します。管理者によるバイパスにはbefore()を使用します。
クイックチェック
モデルのインスタンスを受け取らず、ユーザーだけを受け取るPolicyメソッドはどれですか?
よくある質問
「Policy:モデルベースの認可」レッスンは無料ですか?
はい。「Policy:モデルベースの認可」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、PHP Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 PHP Academyコースには全4レッスンが含まれています。
「Policy:モデルベースの認可」で何を学びますか?
EloquentモデルにPolicyを関連付け、コントローラーで利用します ブラウザで直接実行するハンズオンコードでPHP Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
PHP Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPHP Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「Policy:モデルベースの認可」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPHP Academyレッスンでコードを書いて実行できますか?
はい。すべてのPHP Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Laravel Breezeによる認証
- ミドルウェアでルートを保護する
- Gate:シンプルな認可チェック
- Policy:モデルベースの認可