pportelette/pageable-bundle

This Bundle provides pagination repository's method based on Doctrine Paginator

Maintainers

Package info

github.com/pportelette/SymfonyPageableBundle

Type:symfony-bundle

pkg:composer/pportelette/pageable-bundle

Transparency log

Statistics

Installs: 38

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v0.3.1 2026-07-21 18:34 UTC

This package is auto-updated.

Last update: 2026-07-21 18:35:45 UTC


README

This bundle adds a method 'getPage' to a Doctrine repository that paginates the result of a query. It provides also the methods 'add' and 'remove'.

Installation

Open a command console, enter your project directory and execute:

$ composer require pportelette/pageable-bundle

Applications that don't use Symfony Flex

Then, enable the bundle by adding it to the list of registered bundles in the config/bundles.php file of your project:

// config/bundles.php

return [
    Pportelette\PageableBundle\PportelettePageableBundle::class => ['all' => true],
];

Usage

From a doctrine repository:

// src/Repository/MyRepository.php
use Pportelette\PageableBundle\Repository\AbstractRepository;
use Pportelette\PageableBundle\Model\Pageable;

class MyRepository extends AbstractRepository
{
    public function getAllPaginated(int $page): Pageable {
        $queryBuilder = $this->createQueryBuilder('e');

        $nbPerPage = 50;

        return $this->getPage(
            $queryBuilder,
            $page,
            $nbPerPage
        );
    }
}

That's it!

The third parameter is optional and is '30' by default. It is possible to change the default value by adding a configuration file:

# config/packages/pportelette_pageable.yaml
pportelette_pageable:
  default:
    nb_per_page: 50

Filters and sorting

You can filter or sort your results by binding query params to a column alias, even on joined tables :

public function getUsers(int $page, array $queryParams): Pageable
{
    // bind query params to columns
    $this->addFilter('email', 'u.email');
    $this->addFilter('country', 'c.name');

    $qb = $this->createQueryBuilder('u')
        ->leftJoin('u.country', 'c');

    // this will add the conditions to the where
    $this->setFilters($qb, $queryParams);

    return $this->getPage(
        $qb,
        $page,
    );
}

In the example above, if $queryParams = ['email' => '@test.com', 'country' => 'france', 'sort' => 'country,ASC'], it will generate the following sql :

WHERE u.email LIKE '%@test.com%' AND c.name LIKE '%france%'
ORDER BY c.name ASC