knplabs/knp-components
Knp Components is a PHP component library from KnpLabs. It currently includes the Pager component for building flexible, “fancy” pagination and paging adapters. PHPUnit 10/11 supported; install with Composer and run the test suite via composer test.
This is a PHP 8 paginator with a totally different core concept.
How is it different? First of all, it uses Symfony's event dispatcher to paginate whatever is needed. The pagination process involves triggering events which hit the subscribers. If the subscriber knows how to paginate the given object, it does. Finally, some subscriber must initialize the pagination view object, which will be the result of pagination request. Pagination view can be anything which will be responsible for how to render the pagination.
Magic? no! only KISS principle
Why reinvent the wheel? Can someone tell me what's the definition of wheel in the software world?
// see usage.md for full vars
$dispatcher = '[..]';
$accessor = '[..]';
$paginator = new Knp\Component\Pager\Paginator($dispatcher, $accessor);
$target = range('a', 'u');
// uses event subscribers to paginate $target
$pagination = $paginator->paginate($target, 2/*page*/, 10/*limit*/);
// iterate paginated items
foreach ($pagination as $item) {
//...
}
echo $pagination; // renders pagination
// overriding view rendering
$pagination->renderer = function ($data) use ($template) {
return $twig->render($template, $data);
};
echo $pagination;
Easy paginate over Doctrine ORM query:
$pagination = $paginator->paginate($em->createQuery('SELECT a FROM Entity\Article a'), 1/*page*/, 10/*limit*/);
For applications having custom data repositories (like DDD repositories, CQRS read models) you can provide custom data retrieval inside callbacks.
$repository = ...;
$count = function () use ($repository) {
// your $repository invocation here
};
$items = function ($offset, $limit) use ($repository) {
// your $repository invocation here
};
$target = new CallbackPagination($count, $items);
$pagination = $paginator->paginate($target, 2/*page*/, 10/*limit*/);
// ...
How can I help you explore Laravel packages today?