# Policies in Laravel

What are Policies in Laravel?

Policies in Laravel give a structured approach to handling permission logic related to [Eloquent](https://sorane.io/glossary/eloquent-orm-in-laravel) models. They are classes that have methods for determining whether a user has permission to do specific activities on a given resource.

---

## Origin

Policies are part of Laravel's strong authorization system. It aims to simplify and consolidate permission logic. It does this by using reusable, model-specific classes.

---

## Why are Policies Used?

1. **Promotes Clean Code**: Moves authorization logic out of controllers, keeping them lean and focused.
2. **Supports Granular Permissions**: Gives users exact control over what they can do with certain resources.
3. **Integrates Seamlessly**: Eloquent models and gates are natively supported. They allow for efficient access control.

---

## Best Practices.

1. **Map Policies to Models**: Register policies in the 'AuthServiceProvider' to associate them with their corresponding models.
2. **Use Gates for Simplicity**: Combine policies and gates to handle simple authorization logic that does not require a model.
3. **Test Policies Thoroughly**: Consider all scenarios to ensure secure, predictable access.

---

## Example in Action

Create a policy:

```bash
php artisan make:policy PostPolicy --model=Post
```

Define a policy method:

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

Register the policy in `AuthServiceProvider`:

```php
protected $policies = [
    Post::class => PostPolicy::class,
];
```

Authorize an action in a controller:

```php
$this->authorize('update', $post);
```

Read this definition in a browser: https://ranetrace.com/glossary/policies-in-laravel
