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