РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
737 of 1392 menu

Метод 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."

Смотрите также

  • метод allows,
    который возвращает true, если действие разрешено
  • метод check,
    который является псевдонимом для метода allows
  • метод authorize,
    который выбрасывает исключение при запрете действия
  • метод define,
    который используется для определения новых способностей
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить