<?php
namespace App\DataProvider\Paginator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\AbstractPaginator;
use ApiPlatform\Core\Bridge\Doctrine\Orm\QueryAwareInterface;
use ApiPlatform\Core\DataProvider\PaginatorInterface;
use App\DataTransformer\OrderRequestDataTransformer;
use Doctrine\ORM\Query;
use Doctrine\ORM\QueryBuilder;
use Doctrine\ORM\Tools\Pagination\Paginator as DoctrineOrmPaginator;
class OrderRequestPaginator extends AbstractPaginator implements PaginatorInterface, QueryAwareInterface
{
/**
* @var OrderRequestDataTransformer
*/
private $transformer;
/**
* @var array
*/
private $cachedDenormalizedItems;
/**
* @var array
*/
private $items;
/**
* @var int
*/
private $totalItems;
public function __construct(OrderRequestDataTransformer $transformer, QueryBuilder $queryBuilder)
{
$doctrineOrmPaginator = new DoctrineOrmPaginator($queryBuilder, true);
parent::__construct($doctrineOrmPaginator);
$this->transformer = $transformer;
$this->items = $queryBuilder->getQuery()->getResult();
$this->cachedDenormalizedItems = [];
$this->transformer->setSingleEntity(false);
}
public function getIterator(): \Traversable
{
foreach ($this->items as $item) {
$cacheKey = $item->getId();
if (array_key_exists($cacheKey, $this->cachedDenormalizedItems)) {
yield $this->cachedDenormalizedItems[$cacheKey];
continue;
}
$object = $this->transformer->transform($item);
$this->cachedDenormalizedItems[$cacheKey] = $object;
yield $object;
}
}
/**
* {@inheritdoc}
*/
public function getLastPage(): float
{
if (0 >= $this->maxResults) {
return 1.;
}
return ceil($this->getTotalItems() / $this->maxResults) ?: 1.;
}
/**
* {@inheritdoc}
*/
public function getTotalItems(): float
{
return (float) ($this->totalItems ?? $this->totalItems = \count($this->paginator));
}
/**
* {@inheritdoc}
*/
public function getQuery(): Query
{
return $this->paginator->getQuery();
}
}