issues/27: old meta with pagination and trait and more

This commit is contained in:
Valery Petrov
2026-05-15 14:08:47 +03:00
committed by Valeriy Petrov
parent bc5468e5a0
commit 656f79ff4e
10 changed files with 90 additions and 29 deletions
+43 -1
View File
@@ -15,7 +15,7 @@ use Symfony\Component\HttpFoundation\Request;
*
* Соответствует существующему стилю проекта (см. PriceListController/SpecialistController):
* читает page/perPage из Request, ограничивает perPage и возвращает массив
* ['data' => [...], 'pagination' => [...]] в едином формате для всех контроллеров.
* ['data' => [...], 'pagination' => [...]] в едином формате для новых list-контрактов.
*/
final class Paginator
{
@@ -62,4 +62,46 @@ final class Paginator
],
];
}
/**
* Legacy-формат для ArticleController.
*
* Старый контракт /article/list уже использовался клиентами:
* - размер страницы приходит в query-параметре limit;
* - метаданные лежат в ключе meta;
* - поля называются total/page/limit/totalPages.
*
* @return array{data: list<mixed>, meta: array{total: int, page: int, limit: int, totalPages: int}}
*/
public function paginateWithLegacyMeta(
QueryBuilder $qb,
Request $request,
int $defaultLimit = 20,
int $maxLimit = 100,
): array {
$page = max(1, $request->query->getInt('page', 1));
$limit = min(
max(1, $request->query->getInt('limit', $defaultLimit)),
$maxLimit,
);
$pagerfanta = (new Pagerfanta(new QueryAdapter($qb)))
->setMaxPerPage($limit);
try {
$pagerfanta->setCurrentPage($page);
} catch (NotValidCurrentPageException) {
$pagerfanta->setCurrentPage(max(1, $pagerfanta->getNbPages()));
}
return [
'data' => iterator_to_array($pagerfanta->getCurrentPageResults(), false),
'meta' => [
'total' => $pagerfanta->getNbResults(),
'page' => $pagerfanta->getCurrentPage(),
'limit' => $pagerfanta->getMaxPerPage(),
'totalPages' => $pagerfanta->getNbPages(),
],
];
}
}