issues/27: old meta with pagination and trait and more
This commit is contained in:
committed by
Valeriy Petrov
parent
bc5468e5a0
commit
656f79ff4e
@@ -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(),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user