Метод clear
Метод clear класса RateLimiter применяется
для полного удаления всех записей, связанных с конкретным
ключом ограничения частоты запросов. В качестве единственного
параметра метод принимает строковый ключ, по которому
хранятся данные об ограничении. После вызова этого метода
все попытки и временные метки для указанного ключа будут
очищены, что позволяет сбросить ограничения и начать отсчёт
заново.
Синтаксис
<?php
use Illuminate\Support\Facades\RateLimiter;
RateLimiter::clear($key);
?>
Пример
Давайте добавим ограничение для ключа 'login-attempts',
совершим несколько попыток, а затем очистим данные и проверим
результат:
<?php
use Illuminate\Support\Facades\RateLimiter;
$key = 'login-attempts';
// Выполняем несколько попыток
RateLimiter::hit($key);
RateLimiter::hit($key);
RateLimiter::hit($key);
$available_attempts = RateLimiter::remaining($key);
$res = "Available attempts before clear: " . $available_attempts;
// Очищаем ограничение
RateLimiter::clear($key);
$available_after_clear = RateLimiter::remaining($key);
$res = $res . "; Available attempts after clear: " . $available_after_clear;
echo $res;
?>
Результат выполнения кода:
"Available attempts before clear: 7; Available attempts after clear: 10"
Пример
Рассмотрим пример с очисткой ограничения при успешном выполнении действия. После того как пользователь успешно вошёл в систему, мы очищаем все попытки входа:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\RateLimiter;
use Illuminate\Http\Request;
class AuthController extends Controller
{
public function login(Request $request)
{
$key = 'login-attempts:' . $request->ip();
// Проверяем, не превышено ли ограничение
if (RateLimiter::tooManyAttempts($key, 5)) {
return response()->json([
'error' => 'Too many login attempts.'
], 429);
}
// Имитация попытки входа (неуспешная)
RateLimiter::hit($key, 60);
// Проверка успешности входа (имитация)
if ($request->email === 'user@example.com' && $request->password === 'password') {
// При успешном входе очищаем ограничения
RateLimiter::clear($key);
return response()->json([
'success' => 'Logged in successfully.'
]);
}
return response()->json([
'error' => 'Invalid credentials.'
], 401);
}
}
?>
Пример
Метод clear также полезен при работе с несколькими
типами ограничений для одного пользователя. Очистим все
ограничения для конкретного пользователя:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\RateLimiter;
use App\Models\User;
class UserController extends Controller
{
public function resetRateLimits($userId)
{
$user = User::find($userId);
if (!$user) {
return response()->json([
'error' => 'User not found.'
], 404);
}
// Очищаем ограничения для разных действий
$keys = [
'login-attempts:' . $user->id,
'api-requests:' . $user->id,
'password-reset:' . $user->email
];
foreach ($keys as $key) {
RateLimiter::clear($key);
}
return response()->json([
'success' => 'Rate limits reset successfully.'
]);
}
}
?>
Результат выполнения кода при успешном сбросе:
{"success":"Rate limits reset successfully."}
Смотрите также
-
метод
attempt,
который выполняет действие с учётом ограничений -
метод
hit,
который увеличивает счётчик попыток для ключа -
метод
tooManyAttempts,
который проверяет превышение количества попыток -
метод
remaining,
который возвращает количество оставшихся попыток