[Symfony] Pagination optimisée

Etape 3 : Configurez votre répertoire (repository)

Imaginons ici que vous travaillez sur un système d’utilisateurs. Vous souhaitez simplement lister vos utilisateurs, classés par ordre alphabétique sur le nom de famille, avec un système de pagination.

<?php
// Bundle/Entity/Repository/User.php

use Doctrine\ORM\EntityRepository;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;

class User extends EntityRepository
{
    public function findByPage($page = 1, $max = 10)
    {
        if(!is_numeric($page)) {
            throw new \InvalidArgumentException(
                '$page must be an integer ('.gettype($page).' : '.$page.')'
            );
        }

        if(!is_numeric($page)) {
            throw new \InvalidArgumentException(
                '$max must be an integer ('.gettype($max).' : '.$max.')'
            );
        }

        $dql = $this->createQueryBuilder('user');
        $dql->orderBy('user.lastname', 'ASC');

        $firstResult = ($page - 1) * $max;

        $query = $dql->getQuery();
        $query->setFirstResult($firstResult);
        $query->setMaxResults($max);

        $paginator = new Paginator($query);

        if(($paginator->count() <=  $firstResult) && $page != 1) {
            throw new NotFoundHttpException('Page not found');
        }

        return $paginator;
    }
}

2 commentaires

  1. Bonjour,
    Merci pour votre contribution. Une idée du pourquoi ces autres bundles pourtant forts connus n’ont pas adoptés un fonctionnement similaire ?

    1. Bonjour,

      Je pense simplement que la grande majorité des sites internets ne nécessite pas de travail supplémentaire au sujet de l’optimisation. Le nombre de données / le traffic n’est généralement pas assez important pour en venir à ce genre de réflexion.

      A mon avis du moins.

Laisser un commentaire