Метод denies
Метод denies класса Gate позволяет проверить, запрещено ли текущему пользователю выполнение определённого действия (способности). В отличие от метода allows, который возвращает true при разрешении, denies возвращает true, когда действие запрещено. Первым параметром передаётся имя способности (строковый идентификатор), вторым - объект модели или другой параметр, который будет передан в замыкание способности.
Синтаксис
<?php
use Illuminate\Support\Facades\Gate;
$isDenied = Gate::denies($ability, $arguments);
?>
Пример
Давайте определим способность 'update-post', которая разрешает обновление поста только его автору, и проверим запрет с помощью метода denies:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use App\Models\Post;
use App\Models\User;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::define('update-post', function (User $user, Post $post) {
return $user->id === $post->user_id;
});
}
}
?>
Теперь проверим запрет в контроллере:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Gate;
use App\Models\Post;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function update(Request $request, Post $post)
{
if (Gate::denies('update-post', $post)) {
return response('You are not allowed to update this post.', 403);
}
$post->update($request->all());
return redirect()->route('posts.index');
}
}
?>
Результат выполнения кода при попытке обновления поста другим пользователем:
"You are not allowed to update this post."
Пример
Метод denies можно использовать в Blade-шаблонах для условного отображения контента, когда действие запрещено:
<h1>{{ $post->title }}</h1>
<p>{{ $post->content }}</p>
@if (Gate::denies('update-post', $post))
<p>You cannot edit this post.</p>
@endif
@if (Gate::allows('update-post', $post))
<a href="{{ route('posts.edit', $post) }}">Edit Post</a>
@endif
Результат выполнения кода для пользователя, не являющегося автором поста:
<h1>Post Title</h1>
<p>Post content goes here.</p>
<p>You cannot edit this post.</p>
Пример
Метод denies также может принимать несколько аргументов. Например, для проверки прав на создание поста в определённой категории:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use App\Models\User;
use App\Models\Category;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::define('create-post-in-category', function (User $user, Category $category) {
return $user->role === 'admin' || $category->is_public;
});
}
}
?>
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Gate;
use App\Models\Category;
use Illuminate\Http\Request;
class PostController extends Controller
{
public function create(Request $request)
{
$category = Category::find($request->category_id);
if (Gate::denies('create-post-in-category', $category)) {
return response('You are not allowed to create posts in this category.', 403);
}
return view('posts.create', ['category' => $category]);
}
}
?>
Результат выполнения кода для пользователя с ролью 'user' в закрытой категории:
"You are not allowed to create posts in this category."