Laravel Policyの使い方

Laravel

Laravelのポリシーは、アプリケーションの権限管理を行うための非常に重要なツールです。本記事では、その基本的な使い方について解説します。

Laravel Policyとは?

Laravel Policyは、特定のモデルに対するユーザーの権限を管理するためのクラスです。ポリシーを使用することで、アプリケーションで権限の細かな制御が可能になります。

Policyの作成

ポリシーを作成するには、次のコマンドを実行します。

php artisan make:policy PostPolicy --model=Post

このコマンドにより、app/PoliciesディレクトリにPostPolicyクラスが生成されます。このクラスでは、ポストモデルに関連するユーザーのアクションを許可するためのメソッドを定義します。

Policyの登録

ポリシーを作成したら、それをアプリケーションに登録する必要があります。これを行うには、AppServiceProviderbootメソッドを使用します。

use App\Models\Post;
use App\Policies\PostPolicy;
use Illuminate\Support\Facades\Gate;

public function boot(): void
{
    Gate::policy(Post::class, PostPolicy::class);
}

この登録により、Laravelはポリシーを識別し、関連付けたモデルに対しての認可を行えるようになります。

Policyメソッドの定義

ポリシー内でユーザーの権限を確認するためのメソッドを定義できます。例えば、ポストの更新を許可するかどうかを判断するupdateメソッドを作成します。

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}

上記のメソッドでは、ユーザーのIDがポストの所有者のIDと一致する場合、更新権限を許可します。

ルートでのPolicyの利用

ルートにポリシーを適用するためには、canミドルウェアを使用します。

Route::put('/post/{post}', function (Post $post) {
    // 現在のユーザーがポストを更新できるかどうかをチェック
})->middleware('can:update,post');

この例では、can:updateのミドルウェアがpostモデルをポリシーのupdateメソッドに渡します。

Bladeテンプレートでの利用

Bladeテンプレート内で、ユーザーの権限に応じた表示を制御することもできます。以下のように@can@cannotを使用します。

@can('update', $post)
    <a href="{{ route('posts.edit', $post) }}">Edit</a>
@endcan

この例では、ユーザーがポストを更新できる場合に「Edit」のリンクを表示します。

まとめ

本記事では、Laravelのポリシーの基本的な使い方について説明しました。以下のポイントが重要です。

  • ポリシーはユーザーの権限管理を行うためのクラス
  • make:policyコマンドでポリシーを作成
  • Gateを使ってポリシーを登録
  • メソッドを定義して権限を確認
  • ルートとBladeテンプレートでポリシーを利用

Laravelのポリシーを活用することで、アプリケーションの権限管理が効果的に行えるようになります。