Метод policy
Метод policy класса Gate применяется для регистрации политик авторизации в приложении Laravel. Политика - это класс, который содержит методы для проверки прав пользователя на выполнение определённых действий с моделью. Первым параметром передаётся имя модели, вторым - соответствующий класс политики.
Синтаксис
<?php
use Illuminate\Support\Facades\Gate;
Gate::policy($model, $policy);
?>
Пример
Давайте зарегистрируем политику для модели Article в сервис-провайдере:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use App\Models\Article;
use App\Policies\ArticlePolicy;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::policy(Article::class, ArticlePolicy::class);
}
}
?>
После регистрации политика автоматически будет использоваться при вызове методов авторизации через фасад Gate или вспомогательные функции.
Пример
Давайте создадим политику для модели Article и зарегистрируем её:
<?php
namespace App\Policies;
use App\Models\User;
use App\Models\Article;
class ArticlePolicy
{
public function view(User $user, Article $article): bool
{
return $user->id === $article->user_id;
}
public function update(User $user, Article $article): bool
{
return $user->id === $article->user_id;
}
}
?>
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use App\Models\Article;
use App\Policies\ArticlePolicy;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::policy(Article::class, ArticlePolicy::class);
}
}
?>
Теперь можно использовать зарегистрированную политику для проверки прав:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Gate;
use App\Models\Article;
use App\Models\User;
class ArticleController extends Controller
{
public function show(int $id)
{
$article = Article::find($id);
$user = User::find(1);
if (Gate::forUser($user)->allows('view', $article)) {
echo "User can view article";
} else {
echo "User cannot view article";
}
}
}
?>
Результат выполнения кода:
"User can view article"
Пример
Давайте зарегистрируем несколько политик для разных моделей:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use App\Models\Article;
use App\Models\Category;
use App\Models\User;
use App\Policies\ArticlePolicy;
use App\Policies\CategoryPolicy;
use App\Policies\UserPolicy;
class AuthServiceProvider extends ServiceProvider
{
public function boot(): void
{
Gate::policy(Article::class, ArticlePolicy::class);
Gate::policy(Category::class, CategoryPolicy::class);
Gate::policy(User::class, UserPolicy::class);
}
}
?>
Результат выполнения кода:
"Policies registered successfully"