У каждого, кто писал хоть что-то посерьёзнее 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-ад в контроллерах;
- проще править правила, когда бизнес меняет хотелки.
0 комментариев