= self::MAX_ATTEMPTS; } public function recordFailure(string $ip): void { if ($ip === '') { return; } $key = self::KEY_PREFIX . $ip; // add() only sets if key doesn't exist — creates the window. // If key already exists, add() returns false and we just increment. if (Cache::add($key, 1, self::WINDOW_SECONDS)) { return; } Cache::increment($key); } public function reset(string $ip): void { if ($ip === '') { return; } Cache::delete(self::KEY_PREFIX . $ip); } }