Laminas to Doctrine Paginator-Adapter
Description
A Laminas Framework Module formerly Zend Framework that provides pagination capabilities using doctrine and zend paginator, (*1)
Installation
You can install this package through Composer:, (*2)
composer require bnmosria/paginator-adapter
Usage
On how to use a Laminas-Pagination refers to this page https://docs.laminas.dev/laminas-paginator/usage/., (*3)
In your entity repository you return a doctrine paginator with the requested result set, ex:, (*4)
```php --PostRepository, (*5)
use Doctrine\ORM\Tools\Pagination\Paginator;
...
/**
* Should return a doctrine paginator with a result set of posts
* @return Paginator
*/
public function findPostsByPagination(int $offset = 0, int $limit = 5): Paginator
{
$queryBuilder = $this->_em->createQueryBuilder();
$queryBuilder->select('p')
->from(Post::class, 'p')
->orderBy('p.id', 'DESC')
->setFirstResult($offset)
->setMaxResults($limit);
return new Paginator($queryBuilder->getQuery());
}
Then you can use a Service to request the posts from your PostRepository, ex:
```php --PostService
use Post\Repository\PostRepository;
use PaginatorAdapter\Adapter\Factory\PaginatorFactory;
use PaginatorAdapter\Adapter\PaginatorAdapter;
use Laminas\Paginator\Paginator;
...
/**
* PostService constructor.
*
* @param PostRepository $postRepository
* @param PaginatorAdapter $doctrinePaginatorAdapter
* @param PaginatorFactory $paginatorFactory
*/
public function __construct(
PostRepository $postRepository,
PaginatorAdapter $doctrinePaginatorAdapter,
PaginatorFactory $paginatorFactory
) {
$this->postRepository = $postRepository;
$this->doctrinePaginatorAdapter = $doctrinePaginatorAdapter;
$this->paginatorFactory = $paginatorFactory;
}
...
/**
* Should return a zend paginator with a result set of posts
*
* @return Paginator
*/
public function getPostsByPagination(int $offset = 0, int $limit = 5): Paginator
{
$postsPaginator = $this->postRepository
->findPostsByPagination($offset, $limit);
$this->doctrinePaginatorAdapter
->setPaginator($postsPaginator);
return $this->zendPaginatorFactory
->create($this->doctrinePaginatorAdapter);
}
...
In the action in the Controller just call the service to get a Laminas-Paginator object with the result set., (*6)
```php --PostController, (*7)
use Post\Services\PostService;
...
/**
* PostController constructor.
*
* @param \Post\Services\PostService $postService
*/
public function __construct(PostService $postService)
{
$this->postService = $postService;
}
...
public function indexAction(): ViewModel
{
$page = $this->params()->fromRoute('page');
$maxResult = $this->params()->fromRoute('max_per_page');
$paginator = $this->postService
->getPostsByPagination($page, $maxResult);
$paginator
->setCurrentPageNumber($page)
->setItemCountPerPage($maxResult);
// Here you have a Laminas-Paginator, just use it in your
// view as documented here: https://docs.laminas.dev/laminas-paginator/usage/
return new ViewModel(['posts' => $paginator]);
}
```, (*8)