integer('per_page', $defaultPerPage), 1), $maxPerPage); $page = max((int) $request->integer('page', 1), 1); return ['page' => $page, 'perPage' => $perPage]; } /** * @param callable(object): array $row * @return array{items: list>, meta: array{current_page: int, per_page: int, total: int, last_page: int}} */ public static function payload(LengthAwarePaginator $paginator, callable $row): array { return [ 'items' => collect($paginator->items())->map($row)->values()->all(), 'meta' => self::meta($paginator), ]; } /** * @return array{current_page: int, per_page: int, total: int, last_page: int} */ public static function meta(LengthAwarePaginator $paginator): array { return [ 'current_page' => $paginator->currentPage(), 'per_page' => $paginator->perPage(), 'total' => $paginator->total(), 'last_page' => $paginator->lastPage(), ]; } /** * @param callable(object): array $row */ public static function json(LengthAwarePaginator $paginator, callable $row): JsonResponse { return ApiResponse::success(self::payload($paginator, $row)); } /** * 在标准列表外包一层字段(如 draw_id、job_no),与 items、meta 同级合并。 * * @param callable(object): array $row * @param array $extra */ public static function jsonWith(LengthAwarePaginator $paginator, callable $row, array $extra = []): JsonResponse { return ApiResponse::success(array_merge($extra, self::payload($paginator, $row))); } }