Метод forUser
Метод forUser класса Gate применяется для создания экземпляра шлюза, который будет использовать переданного пользователя для всех последующих проверок прав доступа. Первым и единственным параметром передаётся экземпляр модели пользователя, реализующей интерфейс Authenticatable. Метод возвращает новый экземпляр шлюза, связанный с указанным пользователем.
Синтаксис
<?php
use IlluminateSupportFacadesGate;
$gate = Gate::forUser($user);
$gate->allows('ability', $arguments);
?>
Пример
Давайте проверим, может ли конкретный пользователь редактировать статью, используя метод forUser:
<?php
namespace AppHttpControllers;
use AppModelsUser;
use AppModelsArticle;
use IlluminateSupportFacadesGate;
class ArticleController extends Controller
{
public function checkPermission()
{
$user = User::find(5);
$article = Article::find(3);
$gate = Gate::forUser($user);
if ($gate->allows('update-article', $article)) {
echo "User can update article";
} else {
echo "User cannot update article";
}
}
}
?>
Результат выполнения кода:
"User can update article"
Пример
Давайте определим несколько прав и проверим их для конкретного пользователя, используя метод forUser:
<?php
namespace AppProviders;
use AppModelsUser;
use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
Gate::define('manage-users', function (User $user) {
return $user->role === 'admin';
});
Gate::define('view-reports', function (User $user) {
return in_array($user->role, ['admin', 'manager']);
});
}
}
?>
<?php
namespace AppConsoleCommands;
use AppModelsUser;
use IlluminateConsoleCommand;
use IlluminateSupportFacadesGate;
class CheckPermissionsCommand extends Command
{
protected $signature = 'permissions:check {userId}';
protected $description = 'Check user permissions from console';
public function handle()
{
$userId = $this->argument('userId');
$user = User::find($userId);
if (!$user) {
echo "User not found";
return;
}
$gate = Gate::forUser($user);
$canManageUsers = $gate->allows('manage-users');
$canViewReports = $gate->allows('view-reports');
echo "User ID: " . $user->id;
echo "Can manage users: " . ($canManageUsers ? 'Yes' : 'No');
echo "Can view reports: " . ($canViewReports ? 'Yes' : 'No');
}
}
?>
Результат выполнения команды для пользователя с ID 2:
"User ID: 2"
"Can manage users: No"
"Can view reports: Yes"
Пример
Давайте используем метод forUser для проверки нескольких прав сразу с помощью метода any:
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateSupportFacadesGate;
class AdminController extends Controller
{
public function dashboard()
{
$user = User::where('email', 'editor@example.com')->first();
$gate = Gate::forUser($user);
$hasAccess = $gate->any([
'view-reports',
'manage-users',
'manage-content'
]);
if ($hasAccess) {
echo "User has at least one permission";
} else {
echo "User has none of the permissions";
}
}
}
?>
Результат выполнения кода:
"User has at least one permission"