Installation:
composer require pagerfanta/pagerfanta da/paginator-bundle
Register the bundle in config/bundles.php (Symfony 4+) or AppKernel.php (Symfony 2/3):
return [
// ...
Da\PaginatorBundle\DaPaginatorBundle::class,
];
First Use Case: Fetch paginated data from an array in a controller:
use Symfony\Component\HttpFoundation\Request;
public function indexAction(Request $request)
{
$paginator = $this->get('da_paginator.paginator');
$data = [/* your array data */];
$paginatedContent = $paginator->defineOffsetPaginatedContent(
['id', 'name'], // fields to display
'array',
$data,
$request->query->getInt('page', 1), // current page
5 // items per page
);
return $this->render('template.html.twig', [
'paginatedContent' => $paginatedContent,
]);
}
Twig Integration:
Use the pagerfanta Twig extension to render pagination links:
{{ paginator(paginatedContent) }}
Database Pagination:
Use defineDoctrinePaginatedContent for Doctrine ORM queries:
$paginatedContent = $paginator->defineDoctrinePaginatedContent(
$entityRepository->createQueryBuilder('e'),
$request->query->getInt('page', 1),
10
);
Dynamic Field Mapping: Map fields dynamically (e.g., for API responses):
$fields = ['id', 'name', 'createdAt'];
$paginatedContent = $paginator->defineOffsetPaginatedContent(
$fields,
'array',
$data,
$page,
$limit
);
Custom Adapter:
Extend Pagerfanta\Adapter\AdapterInterface for non-standard data sources (e.g., Elasticsearch):
$adapter = new CustomAdapter($client->search());
$paginator = new Pagerfanta(new CustomAdapter($adapter));
API Pagination: Return paginated JSON responses:
return $this->json([
'data' => $paginatedContent->getCurrentPageResults(),
'pagination' => [
'total' => $paginatedContent->getNbResults(),
'pages' => $paginatedContent->getNbPages(),
'current' => $paginatedContent->getCurrentPage(),
],
]);
Pagerfanta\Bridge\Doctrine\ORM\QueryAdapter with Symfony\Bridge\Doctrine\Form\Type\EntityType for paginated form fields.ApiPlatform\Core\Bridge\Doctrine\Orm\Paginator for standardized API pagination.Pagerfanta\Event\InitializeEvent for pre-pagination logic (e.g., filtering).Field Mapping Errors:
defineOffsetPaginatedContent match the array keys exactly (case-sensitive).var_dump($data[0]) to verify structure.Doctrine Pagination Quirks:
setFirstResult() and setMaxResults() explicitly if defineDoctrinePaginatedContent behaves unexpectedly.DISTINCT in queries—it can break pagination counts.Performance:
Pagerfanta\Pagerfanta with Pagerfanta\Adapter\LimitedAdapter to limit loaded items:
$adapter = new LimitedAdapter($originalAdapter, 100);
Twig Debugging:
{{ paginator(paginatedContent) }} renders nothing, check:
pagerfanta Twig extension is enabled (da_paginator.twig.pagerfanta service).paginatedContent object is valid (call isValid()).Log Pagination Data:
$this->get('logger')->debug(
'Pagination Data',
[
'total' => $paginatedContent->getNbResults(),
'page' => $paginatedContent->getCurrentPage(),
'items' => count($paginatedContent->getCurrentPageResults()),
]
);
Check Adapter: Verify the adapter returns correct data:
$adapter = $paginatedContent->getAdapter();
$data = $adapter->getSlice(0, 10); // Test first 10 items
Custom Twig Functions: Extend the Twig environment to add custom pagination templates:
$twig->addFunction(new \Twig\TwigFunction('custom_paginator', [$this, 'renderCustomPaginator']));
Override Paginator Service:
Replace the default service in services.yaml:
da_paginator.paginator:
class: App\Service\CustomPaginator
arguments: ['@pagerfanta.factory']
Add Metadata:
Extend Da\PaginatorBundle\Paginator\Paginator to include custom metadata (e.g., API links):
public function getApiLinks() { /* ... */ }
Event Subscribers:
Listen for Pagerfanta\Event\ViewEvent to modify rendered pagination:
$view->variables['custom_var'] = 'value';
How can I help you explore Laravel packages today?