Installation:
composer require coka/pagination-bundle
Enable the bundle in config/bundles.php:
return [
// ...
CedrickOka\PaginationBundle\OkaPaginationBundle::class => ['all' => true],
];
First Use Case:
use CedrickOka\PaginationBundle\Pagination\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
public function index(PaginatorInterface $paginator, Request $request)
{
$queryBuilder = $this->getDoctrine()->getRepository(MyEntity::class)->createQueryBuilder('e');
$pagination = $paginator->paginate(
$queryBuilder,
$request->query->getInt('page', 1),
10 // items per page
);
return $this->render('my_template.html.twig', ['pagination' => $pagination]);
}
{% for item in pagination.items %}
{{ item.name }}
{% endfor %}
{{ pagination|oka_pagination }}
Key Files:
docs/index.md for core concepts.src/Resources/views/ for default Twig templates (overrideable).QueryBuilder Pagination:
$queryBuilder = $entityManager->getRepository(MyEntity::class)
->createQueryBuilder('e')
->where('e.status = :status')
->setParameter('status', 'active');
$pagination = $paginator->paginate($queryBuilder, $page, $limit);
Array Pagination (for non-DB data):
$items = $this->getArrayData(); // e.g., API responses
$pagination = $paginator->paginateArray($items, $page, $limit);
Custom Twig Filters: Extend default rendering:
{{ pagination|oka_pagination({
'template': '@MyBundle/Pagination/custom.html.twig',
'pageParameter': 'custom_page'
}) }}
Event Listeners:
Subscribe to oka_pagination.build to modify pagination logic:
// src/EventListener/PaginationListener.php
public function onBuild(PaginationEvent $event) {
$event->setItemsPerPage($event->getItemsPerPage() * 2); // Double items per page
}
Register in services.yaml:
services:
App\EventListener\PaginationListener:
tags:
- { name: kernel.event_listener, event: oka_pagination.build }
API Responses: Serialize pagination metadata:
return $this->json([
'data' => $pagination->getItems(),
'meta' => [
'current_page' => $pagination->getCurrentPage(),
'total_pages' => $pagination->getTotalPages(),
]
]);
QueryBuilder (supports DQL).PaginationEvent to inject pagination into collections.QueryBuilder results if pagination is static (e.g., product listings).QueryBuilder Modification:
QueryBuilder after passing it to paginate(). The bundle clones it internally, but side effects (e.g., ->orderBy()) may persist.QueryBuilder or reset it:
$qb = $entityManager->getRepository(MyEntity::class)->createQueryBuilder('e');
$qb->resetDQLPart('orderBy'); // Reset if needed
Twig Template Overrides:
twig.config.paths.var/log/dev.log for missing template errors.Pagination Events:
$event->getQueryBuilder() to alter queries.$event->setQueryBuilder() after modifications.Array Pagination Limits:
paginateArray() does not support QueryBuilder features (e.g., COUNT queries). Use only for in-memory data.Performance:
QueryBuilder uses SELECT only needed fields (avoid SELECT *).->setMaxResults() and ->setFirstResult() manually for fine-grained control.Log Pagination Data:
$this->logger->debug('Pagination', [
'items' => count($pagination->getItems()),
'total' => $pagination->getTotalItems(),
'query' => $pagination->getQueryBuilder()->getDQL(),
]);
Check Event Dispatching: Enable Symfony’s event dispatcher debug:
$this->container->get('debug.stopwatch')->check('pagination');
Validate Twig Templates:
Use {{ dump(pagination) }} to inspect the object structure in templates.
Custom Pagination Classes:
Extend CedrickOka\PaginationBundle\Pagination\Pagination to add methods:
class MyCustomPagination extends Pagination {
public function getFilteredItems() {
return array_filter($this->items, fn($item) => $item->isActive());
}
}
Register as a service:
services:
App\Pagination\MyCustomPagination:
parent: oka_pagination.pagination
tags: ['oka_pagination.pagination']
Dynamic Items Per Page:
Use a Request parameter:
$limit = $request->query->getInt('per_page', 10);
$pagination = $paginator->paginate($qb, $page, $limit);
Localization:
Override translation keys in config/packages/oka_pagination.yaml:
oka_pagination:
templates:
pagination: '@MyBundle/Pagination/custom.html.twig'
translation:
previous: '« Anterior'
next: 'Siguiente »'
AJAX Support: Render only pagination links for AJAX:
{% if request.isXmlHttpRequest %}
{{ pagination|oka_pagination({'template': '@OkaPagination/pagination_links.html.twig'}) }}
{% endif %}
How can I help you explore Laravel packages today?