Files
lotteryLaravel/app/Support/AdminApiList.php

76 lines
2.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
namespace App\Support;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
/**
* 后台标准列表:`items` + `meta`current_page / per_page / total / last_page
* 供各 Admin Index 控制器复用,避免重复拼装分页 JSON。
*/
final class AdminApiList
{
public const DEFAULT_PER_PAGE = 25;
public const MAX_PER_PAGE = 100;
/**
* 读取 `page`、`per_page`,并夹在 [1, maxPerPage]。
*
* @return array{page: int, perPage: int}
*/
public static function readPaging(Request $request, int $defaultPerPage = self::DEFAULT_PER_PAGE, int $maxPerPage = self::MAX_PER_PAGE): array
{
$perPage = min(max((int) $request->integer('per_page', $defaultPerPage), 1), $maxPerPage);
$page = max((int) $request->integer('page', 1), 1);
return ['page' => $page, 'perPage' => $perPage];
}
/**
* @param callable(object): array<string, mixed> $row
* @return array{items: list<array<string, mixed>>, 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<string, mixed> $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<string, mixed> $row
* @param array<string, mixed> $extra
*/
public static function jsonWith(LengthAwarePaginator $paginator, callable $row, array $extra = []): JsonResponse
{
return ApiResponse::success(array_merge($extra, self::payload($paginator, $row)));
}
}