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

Метод define

Метод define класса Gate применяется для регистрации разрешений (abilities). Первым параметром передаётся строка - имя разрешения (например, 'edit-post'), вторым - замыкание, которое принимает текущего пользователя и дополнительные аргументы (например, модель). Замыкание должно возвращать true, если пользователь имеет право на действие, и false в противном случае.

Синтаксис

<?php use Illuminate\Support\Facades\Gate; Gate::define($ability, $callback); ?>

Пример

Определим разрешение на редактирование статьи. Логика будет проверять, что идентификатор пользователя совпадает с идентификатором автора статьи:

<?php namespace App\Providers; use Illuminate\Support\Facades\Gate; use App\Models\User; use App\Models\Article; class AuthServiceProvider extends ServiceProvider { public function boot() { Gate::define('edit-article', function (User $user, Article $article) { return $user->id === $article->user_id; }); } } ?>

После определения разрешения, его можно проверить в контроллере или представлении:

<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Gate; use App\Models\Article; class ArticleController extends Controller { public function edit($id) { $article = Article::findOrFail($id); if (Gate::denies('edit-article', $article)) { abort(403, 'You do not have permission to edit this article.'); } return view('article.edit', ['article' => $article]); } } ?>

Результат выполнения кода при попытке редактирования чужой статьи:

"403 You do not have permission to edit this article."

Пример

Определим разрешение, которое не требует дополнительных аргументов. Например, проверка, является ли пользователь администратором:

<?php namespace App\Providers; use Illuminate\Support\Facades\Gate; use App\Models\User; class AuthServiceProvider extends ServiceProvider { public function boot() { Gate::define('admin-access', function (User $user) { return $user->role === 'admin'; }); } } ?>

Использование разрешения admin-access в шаблоне Blade:

@can('admin-access') <h1>Welcome, Admin!</h1> <p>You have access to the admin panel.</p> @endcan @cannot('admin-access') <p>You do not have admin privileges.</p> @endcannot

Результат для пользователя с ролью 'admin':

<h1>Welcome, Admin!</h1> <p>You have access to the admin panel.</p>

Результат для обычного пользователя:

<p>You do not have admin privileges.</p>

Пример

Определим разрешение с несколькими дополнительными аргументами. Например, проверка, может ли пользователь обновить определённое поле статьи:

<?php namespace App\Providers; use Illuminate\Support\Facades\Gate; use App\Models\User; use App\Models\Article; class AuthServiceProvider extends ServiceProvider { public function boot() { Gate::define('update-article-field', function (User $user, Article $article, string $field) { if ($user->id !== $article->user_id) { return false; } $allowedFields = ['title', 'content', 'status']; return in_array($field, $allowedFields); }); } } ?>

Пример проверки в контроллере:

<?php namespace App\Http\Controllers; use Illuminate\Support\Facades\Gate; use App\Models\Article; class ArticleController extends Controller { public function updateField($id, $field) { $article = Article::findOrFail($id); if (Gate::allows('update-article-field', [$article, $field])) { // Логика обновления поля return 'Field can be updated.'; } return 'You cannot update this field.'; } } ?>

Результат для автора статьи, пытающегося обновить поле 'title':

"Field can be updated."

Результат для автора, пытающегося обновить поле 'id':

"You cannot update this field."

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

  • метод allows,
    который проверяет, имеет ли пользователь право на действие
  • метод denies,
    который проверяет отсутствие права на действие
  • метод policy,
    который связывает модель с классом политики авторизации
  • функция can,
    которая проверяет разрешение в представлениях Blade
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить