$val) { header("{$key}: {$val}"); } echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); exit(); } /** * Send API Success Response * * @param string $message * @param mixed $data * @param int $status */ public static function success(string $message = 'Success', $data = null, int $status = 200): void { self::json([ 'success' => true, 'status_code' => $status, 'message' => $message, 'data' => $data, 'timestamp' => date('Y-m-d H:i:s'), ], $status); } /** * Send API Error Response * * @param string $message * @param int $status * @param array $errors */ public static function error(string $message = 'Error occurred', int $status = 400, array $errors = []): void { self::json([ 'success' => false, 'status_code' => $status, 'error' => [ 'message' => $message, 'details' => $errors, ], 'timestamp' => date('Y-m-d H:i:s'), ], $status); } /** * Send Paginated API Response * * @param array $items * @param int $total * @param int $page * @param int $limit * @param string $message */ public static function paginate(array $items, int $total, int $page = 1, int $limit = 20, string $message = 'Data retrieved successfully'): void { $totalPages = $limit > 0 ? (int)ceil($total / $limit) : 1; self::json([ 'success' => true, 'status_code' => 200, 'message' => $message, 'data' => $items, 'pagination' => [ 'total_items' => $total, 'current_page' => $page, 'items_per_page' => $limit, 'total_pages' => $totalPages, 'has_next' => $page < $totalPages, 'has_prev' => $page > 1, ], 'timestamp' => date('Y-m-d H:i:s'), ], 200); } /** * Redirect to URL (For Frontend Views) * * @param string $url * @param int $status */ public static function redirect(string $url, int $status = 302): void { http_response_code($status); header("Location: {$url}"); exit(); } }