laravel-policies について
laravel-policiesは、Laravelで認可を実装する開発者向けのスキルです。Policyから権限システムへ委譲し、所有権やリソース状態の確認と組み合わせる方法を説明します。
主な機能
- 01標準およびカスタムPolicyメソッド
- 02権限Enumの使用
- 03所有権と状態の確認
- 04ルートでのPolicy認可
- 05簡潔な認可ロジック
活用シーン
- 01リソースのアクセス規則の実装
- 02操作前の所有権確認
- 03リソース状態に応じた操作制限
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ leeovery/ agentic-skills --skill laravel-policiesインストール後、Claude Code で/laravel-policiesを入力して読み込まれたか確認します。
詳細
Laravel ポリシー
ポリシーは認可ロジックをカプセル化し、権限システムに委譲します。
関連ガイド:
- routing-permissions.md - ルートレベルの認可
- 列挙型 - 権限の列挙型
構造
<?php
declare(strict_types=1);
namespace App\Policies;
use App\Enums\Permission;
use App\Models\Order;
use App\Models\User;
class OrderPolicy
{
public function viewAny(User $user): bool
{
return $user->can(Permission::ListOrders);
}
public function view(User $user, Order $order): bool
{
return $user->can(Permission::ViewOrders)
&& $order->customer_id === $user->customer_id;
}
public function create(User $user): bool
{
return $user->can(Permission::CreateOrders);
}
public function update(User $user, Order $order): bool
{
return $user->can(Permission::UpdateOrders)
&& $order->canBeModified()
&& $order->customer_id === $user->customer_id;
}
public function delete(User $user, Order $order): bool
{
return $user->can(Permission::DeleteOrders)
&& $order->isPending();
}
public function cancel(User $user, Order $order): bool
{
return $this->update($user, $order)
&& $order->canBeCancelled();
}
}
権限の列挙型
<?php
declare(strict_types=1);
namespace App\Enums;
use Henzeb\Enumhancer\Concerns\Comparison;
use Henzeb\Enumhancer\Concerns\Dropdown;
enum Permission: string
{
use Comparison, Dropdown;
case ListOrders = 'list orders';
case ViewOrders = 'view orders';
case CreateOrders = 'create orders';
case UpdateOrders = 'update orders';
case DeleteOrders = 'delete orders';
case CancelOrders = 'cancel orders';
}
標準的なポリシーメソッド
Laravel の規約に準拠したポリシーメソッド:
viewAny()- 一覧/インデックスview()- 単一のリソースを表示create()- 新しいリソースを作成update()- リソースを更新delete()- リソースを削除restore()- ソフトデリートされたリソースを復元forceDelete()- リソースを完全に削除
標準以外のアクションにはカスタムメソッドを使用します:
cancel()approve()ship()- など
主なパターン
1. 権限システムに委譲する
return $user->can(Permission::CreateOrders);
2. 所有権の確認
return $user->can(Permission::ViewOrders)
&& $order->customer_id === $user->customer_id;
3. 状態の確認
return $user->can(Permission::DeleteOrders)
&& $order->isPending();
4. 既存のメソッドを組み合わせる
public function cancel(User $user, Order $order): bool
{
return $this->update($user, $order)
&& $order->canBeCancelled();
}
ルートでの使用
Route::get('/orders', [OrderController::class, 'index'])
->can('viewAny', Order::class);
Route::get('/orders/{order}', [OrderController::class, 'show'])
->can('view', 'order');
Route::post('/orders', [OrderController::class, 'store'])
->can('create', Order::class);
ルートの認可については、routing-permissions.md を参照してください。
まとめ
ポリシーでは次の点を守ってください:
- 文字列ではなく権限の列挙型を使用する
- 必要に応じて所有権を確認する
- 必要に応じて状態を確認する
- 権限システムに委譲する
- Laravel の命名規約に従う
- シンプルで焦点を絞った状態に保つ
コメント
Markdown 対応