Gates
Los Gates son closures que determinan si un usuario esta autorizado para realizar una accion determinada. Son una forma simple y rapida de definir reglas de autorizacion.
Definir Gates
// En AppServiceProvider o AuthServiceProvider
use Illuminate\Support\Facades\Gate;
public function boot(): void
{
Gate::define('update-post', function (User $user, Post $post) {
return $user->id === $post->user_id;
});
Gate::define('admin', function (User $user) {
return $user->is_admin;
});
// Super admin que puede todo
Gate::before(function (User $user) {
if ($user->isSuperAdmin()) {
return true;
}
});
}
Usar Gates
// En controladores
if (Gate::allows('update-post', $post)) {
// Autorizado
}
if (Gate::denies('update-post', $post)) {
abort(403);
}
// Con el metodo authorize (lanza excepcion automaticamente)
Gate::authorize('update-post', $post);
// En Blade
@can('update-post', $post)
<a href="{{ route('posts.edit', $post) }}">Editar</a>
@endcan
// En el modelo User
$user->can('update-post', $post);
Los Gates son ideales para autorizaciones simples. Para logica mas compleja asociada a modelos, es mejor usar Policies.