#1. Bản chất
- Gate: Dùng cho các logic đơn giản, không gắn liền với Model (VD:
Gate::define('access-dashboard', ...)). - Policy: Gắn liền với một Model (VD:
PostPolicychoPostModel).
#2. Cách hoạt động
Laravel sử dụng Illuminate\Auth\Access\Gate. Khi bạn gọi can(), Gate sẽ tự động map class Model với Policy tương ứng thông qua Policy Mapping.
#3. Câu hỏi nhanh
Q: Tại sao nên ưu tiên dùng Policy hơn Gate?
A: Policy tổ chức code tốt hơn (S/O trong SOLID). Mỗi model có 1 file Policy riêng, tránh làm phình to AuthServiceProvider.
Q: Làm sao để kiểm tra quyền mà không throw ra Exception?
A: Sử dụng Gate::allows() hoặc Gate::check() thay vì $user->can(). can() sẽ ném AuthorizationException nếu quyền không được cấp.