ecommit/paginator
Lightweight PHP paginator for arrays or ArrayIterator. Configure page, max_per_page, and data; optionally provide total count for large datasets. Iterate results, get last page, and use count() to know items on the current page.
Pros:
count option), reducing memory overhead for large datasets.IteratorAggregate, enabling seamless integration with Laravel’s Blade loops or API responses.Cons:
Illuminate\Pagination\LengthAwarePaginator (e.g., no URL generation, view rendering, or API resource compatibility).getLastPage(), count()), unlike Laravel’s built-in paginator.paginate()).Response::json($paginator->items())).paginate() (which requires a query builder or collection).count is precomputed).count($data) on a 1M-row array is slow).?page=N parameters (e.g., via Request facade).tailwind, bootstrap) without custom templates.cursor(), this paginator cannot efficiently handle offset-based pagination for large DB tables.LengthAwarePaginator for API responses.count for large datasets, or will you rely on count($data) (slow for >10K items)?Collection::paginate() or LengthAwarePaginator suffice with minor adjustments?Model::paginate()).array_slice() pagination with ArrayPaginator for API responses.// Before
$data = collect($allItems)->slice($page * $perPage, $perPage);
return response()->json($data);
// After
$paginator = new ArrayPaginator([
'page' => $page,
'max_per_page' => $perPage,
'data' => $allItems,
'count' => $totalItems,
]);
return response()->json([
'data' => iterator_to_array($paginator),
'meta' => [
'total' => $totalItems,
'per_page' => $perPage,
'current_page' => $page,
],
]);
ArrayPaginator in a custom trait/class to add Laravel-specific features:
use Ecommit\Paginator\ArrayPaginator;
use Illuminate\Pagination\LengthAwarePaginator as LaravelPaginator;
class LaravelArrayPaginator extends ArrayPaginator
{
public function toLaravelPaginator(int $total): LaravelPaginator
{
return new LaravelPaginator(
$this->getCurrentPageItems(),
$total,
$this->getMaxPerPage(),
$this->getPage(),
['path' => request()->url()]
);
}
}
return new LaravelArrayPaginatorResource($paginator->toLaravelPaginator($total));
DB::table()->paginate() wrapper).Model::paginate().?page=N (e.g., via Request or URL::current()).LaravelArrayPaginator) for Blade/API use cases.meta fields).page values).Collection methods).count.count (e.g., count($data) on 1M items is O(n)).count is null (unlike database cursors).cursor()).| Scenario | Impact | Mitigation |
|---|---|---|
Invalid page value |
Silent failure or infinite loop | Validate page input (e.g., max(1, min($page, $lastPage))). |
Missing count |
Full array loaded into memory | Always precompute count for large datasets. |
Empty data |
Empty pagination | Add guards (e |
How can I help you explore Laravel packages today?