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.
Installation:
composer require ecommit/paginator
Add the namespace to your composer.json autoload or use it directly in your code.
First Use Case: Paginate an array of results in a controller or service:
use Ecommit\Paginator\ArrayPaginator;
$data = ['item1', 'item2', ..., 'item1000'];
$paginator = new ArrayPaginator([
'page' => request('page', 1),
'max_per_page' => 20,
'data' => $data,
]);
Where to Look First:
ArrayPaginator class: Core implementation for array-based pagination.PaginatorInterface: API contract for methods like getLastPage(), getCurrentPage(), and iteration.Basic Array Pagination:
$paginator = new ArrayPaginator([
'page' => $request->input('page', 1),
'max_per_page' => 15,
'data' => $yourArrayData,
]);
foreach ($paginator as $item) to iterate over the current page’s items.$paginator->getLastPage() or $paginator->getCurrentPage().Large Datasets (Lazy Loading):
count option to optimize memory for large datasets:
$paginator = new ArrayPaginator([
'page' => 2,
'max_per_page' => 10,
'count' => 1000, // Total items (e.g., from DB count)
'data' => $currentPageItems, // Only items for page 2
]);
Integration with Laravel Views:
return view('results', [
'paginator' => $paginator,
]);
{{ $paginator->appends(request()->query())->links() }}
(Note: Extend the package or wrap it in a Laravel-specific trait for full compatibility.)Dynamic Pagination in APIs:
return response()->json([
'data' => iterator_to_array($paginator),
'meta' => [
'current_page' => $paginator->getCurrentPage(),
'last_page' => $paginator->getLastPage(),
'per_page' => $paginator->getMaxPerPage(),
],
]);
Custom Iterators:
ArrayIterator for non-array data sources (e.g., database cursors):
$iterator = new \ArrayIterator($yourData);
$paginator = new ArrayPaginator([
'data' => $iterator,
'max_per_page' => 25,
]);
count vs. data Mismatch:
count is provided, data must only contain items for the current page. Passing all data will break pagination logic.$paginator = new ArrayPaginator([
'count' => 1000,
'data' => $allItems, // ❌ Wrong: `data` should only be page 1's items.
]);
Zero-Based vs. One-Based Pages:
page=1 is the first page). Ensure your frontend/backend aligns with this.Empty Data Handling:
data is empty, the paginator will return an empty iterator. Validate input to avoid edge cases like:
if (empty($paginator->getData())) {
return response()->json(['error' => 'No data found']);
}
Performance with Large data:
data when count is not used. The package loads all data into memory for pagination calculations.No Built-in Laravel Integration:
@foreach ($paginator as $item)).Verify count and data:
\Log::debug('Paginator count:', [$paginator->getCount(), count($paginator->getData())]);
Check Page Bounds:
page exceeds getLastPage(), the paginator returns an empty iterator. Handle this gracefully:
if ($paginator->getCurrentPage() > $paginator->getLastPage()) {
abort(404, 'Page not found');
}
Iterator Issues:
ArrayIterator, ensure it’s not modified externally during pagination (e.g., by another loop).Custom Paginator Classes:
PaginatorInterface to create domain-specific paginators (e.g., for APIs or admin panels).Add Laravel Compatibility:
ArrayPaginator to support Laravel’s Illuminate\Pagination\LengthAwarePaginator interface:
class LaravelPaginator extends ArrayPaginator implements LengthAwarePaginator
{
public function getCollection() { /* ... */ }
public function getUrl($page) { /* ... */ }
}
Caching:
$cacheKey = "paginator_{$request->page}_{$request->category}";
return Cache::remember($cacheKey, now()->addHours(1), function () use ($request, $data) {
return new ArrayPaginator([...]);
});
Event Hooks:
PaginatorCreated) to log or modify paginator behavior:
event(new PaginatorCreated($paginator));
max_per_page defaults to 100, which may be too high for APIs. Override it per request:
$paginator = new ArrayPaginator([
'max_per_page' => $request->input('per_page', 10), // Default to 10
]);
'max_per_page' vs. 'MaxPerPage').How can I help you explore Laravel packages today?