У каждого, кто писал хоть что-то посерьёзнее todo-листа, есть стадия: «А давай прямо в контроллере проверим if ($user->role == 'admin')». А потом ещё условие, потом ещё… Через пару месяцев у тебя на 100 строк контроллера приходится 80 строк логики прав.

Laravel предлагает более вменяемый способ — политики. Это отдельные классы, где лежат правила доступа к моделям.

Создание Policy

Создаём политику для постов:

php artisan make:policy PostPolicy

Laravel положит её в app/Policies/PostPolicy.php.

Определение методов

Внутри пишем, кто может смотреть пост:

namespace App\Policies;

use App\Models\Post;
use App\Models\User;

class PostPolicy
{
    public function view(User $user, Post $post)
    {
        // Разрешаем только владельцу
        return $user->id === $post->user_id;
    }
}

Регистрация

Подключаем её в AuthServiceProvider:

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use App\Models\Post;
use App\Policies\PostPolicy;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        Post::class => PostPolicy::class,
    ];

    public function boot()
    {
        $this->registerPolicies();
    }
}

Использование

Теперь в контроллере можно не писать километры условий:

public function show(Post $post)
{
    $this->authorize('view', $post);

    return view('post.show', compact('post'));
}

Laravel сам вызовет PostPolicy@view.

Вывод

Политики — не академический фанатизм, а реально рабочий способ:

  • держать авторизацию в одном месте;
  • не плодить if-ад в контроллерах;
  • проще править правила, когда бизнес меняет хотелки.