Метод after
Метод after класса Gate позволяет зарегистрировать
глобальный callback, который будет выполняться после всех проверок
прав доступа. Этот callback получает результат основной проверки
и может переопределить его. Первым параметром передается имя
пользователя или null для гостя, вторым - имя способности,
третьим - массив параметров, четвертым - результат основной проверки.
Callback должен возвращать true или false.
Синтаксис
<?php
use Illuminate\Support\Facades\Gate;
Gate::after(function ($user, $ability, $params, $result) {
return $result;
});
?>
Пример
Давайте зарегистрируем глобальный callback, который позволяет администратору выполнять любые действия:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
Gate::after(function ($user, $ability, $params, $result) {
if ($user && $user->is_admin) {
return true;
}
return $result;
});
}
}
?>
Пример
Теперь проверим права доступа для обычного пользователя и администратора:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Gate;
use App\Models\User;
class UserController extends Controller
{
public function checkAccess()
{
$regularUser = User::where('email', 'user@example.com')->first();
$adminUser = User::where('email', 'admin@example.com')->first();
$resRegular = Gate::forUser($regularUser)->allows('edit-settings');
$resAdmin = Gate::forUser($adminUser)->allows('edit-settings');
echo $resRegular ? 'true' : 'false';
echo PHP_EOL;
echo $resAdmin ? 'true' : 'false';
}
}
?>
Результат выполнения кода:
"false"
"true"
Пример
Если основной проверки не существует, метод after все равно
будет вызван. В таком случае параметр result будет равен null:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
Gate::after(function ($user, $ability, $params, $result) {
if ($result === null) {
return false;
}
return $result;
});
}
}
?>
Пример
Метод after может использоваться для логирования всех проверок прав доступа:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Log;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
public function boot()
{
Gate::after(function ($user, $ability, $params, $result) {
$userId = $user ? $user->id : 'guest';
Log::info("User {$userId} checked ability '{$ability}' with result " . ($result ? 'true' : 'false'));
return $result;
});
}
}
?>