<?php
namespace App\Service;
use Doctrine\ORM\Query;
use Knp\Component\Pager\Pagination\PaginationInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\OptionsResolver\OptionsResolver;
class PagerService
{
const LIMIT_PER_PAGE = 10;
const LIMIT_ALLOWED_MAX = 100;
/**
* @var PaginatorInterface
*/
protected $paginator;
public function __construct(PaginatorInterface $paginator)
{
$this->paginator = $paginator;
}
/**
* @param Query $query
* @param bool $options
* @return PaginationInterface
*/
public function paginate(Query $query, $options = false)
{
if (!$options) {
$options = $this->getPaginationOptions();
}
return $this->paginator->paginate($query, $options['page'], $options['limit']);
}
/**
* @param array $defaults
* @return array
*/
public function getPaginationOptions($defaults = [])
{
$request = Request::createFromGlobals();
$optionsResolver = new OptionsResolver();
$optionsResolver->setDefaults([
'page' => 1,
'limit' => self::LIMIT_PER_PAGE,
]);
$defaults = $optionsResolver->resolve($defaults);
$max = $request->query->getInt('limit', $defaults['limit']);
$max = $max > self::LIMIT_ALLOWED_MAX ? self::LIMIT_ALLOWED_MAX : $max;
return [
'page' => $request->query->getInt('page', $defaults['page']),
'limit' => $max,
];
}
}