--- name: laravel-policies description: Authorization policies for resource access control. Use when working with authorization, permissions, access control, or when user mentions policies, authorization, permissions, can, ability checks. --- # Laravel Policies Policies encapsulate authorization logic and delegate to permission systems. **Related guides:** - [routing-permissions.md](../laravel-routing/references/routing-permissions.md) - Route-level authorization - [Enums](../laravel-enums/SKILL.md) - Permission enums ## Structure ```php 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(); } } ``` ## Permission Enum ```php can(Permission::CreateOrders); ``` ### 2. Ownership Checks ```php return $user->can(Permission::ViewOrders) && $order->customer_id === $user->customer_id; ``` ### 3. State Checks ```php return $user->can(Permission::DeleteOrders) && $order->isPending(); ``` ### 4. Combine Existing Methods ```php public function cancel(User $user, Order $order): bool { return $this->update($user, $order) && $order->canBeCancelled(); } ``` ## Usage in Routes ```php 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); ``` See [routing-permissions.md](../laravel-routing/references/routing-permissions.md) for route authorization. ## Summary **Policies should:** - Use permission enums (not strings) - Check ownership when needed - Check state when needed - Delegate to permission system - Follow Laravel naming conventions - Stay simple and focused