src/DataProvider/Paginator/OrderRequestPaginator.php line 15

Open in your IDE?
  1. <?php
  2. namespace App\DataProvider\Paginator;
  3. use ApiPlatform\Core\Bridge\Doctrine\Orm\AbstractPaginator;
  4. use ApiPlatform\Core\Bridge\Doctrine\Orm\QueryAwareInterface;
  5. use ApiPlatform\Core\DataProvider\PaginatorInterface;
  6. use App\DataTransformer\OrderRequestDataTransformer;
  7. use Doctrine\ORM\Query;
  8. use Doctrine\ORM\QueryBuilder;
  9. use Doctrine\ORM\Tools\Pagination\Paginator as DoctrineOrmPaginator;
  10. class OrderRequestPaginator extends AbstractPaginator implements PaginatorInterface, QueryAwareInterface
  11. {
  12. /**
  13. * @var OrderRequestDataTransformer
  14. */
  15. private $transformer;
  16. /**
  17. * @var array
  18. */
  19. private $cachedDenormalizedItems;
  20. /**
  21. * @var array
  22. */
  23. private $items;
  24. /**
  25. * @var int
  26. */
  27. private $totalItems;
  28. public function __construct(OrderRequestDataTransformer $transformer, QueryBuilder $queryBuilder)
  29. {
  30. $doctrineOrmPaginator = new DoctrineOrmPaginator($queryBuilder, true);
  31. parent::__construct($doctrineOrmPaginator);
  32. $this->transformer = $transformer;
  33. $this->items = $queryBuilder->getQuery()->getResult();
  34. $this->cachedDenormalizedItems = [];
  35. $this->transformer->setSingleEntity(false);
  36. }
  37. public function getIterator(): \Traversable
  38. {
  39. foreach ($this->items as $item) {
  40. $cacheKey = $item->getId();
  41. if (array_key_exists($cacheKey, $this->cachedDenormalizedItems)) {
  42. yield $this->cachedDenormalizedItems[$cacheKey];
  43. continue;
  44. }
  45. $object = $this->transformer->transform($item);
  46. $this->cachedDenormalizedItems[$cacheKey] = $object;
  47. yield $object;
  48. }
  49. }
  50. /**
  51. * {@inheritdoc}
  52. */
  53. public function getLastPage(): float
  54. {
  55. if (0 >= $this->maxResults) {
  56. return 1.;
  57. }
  58. return ceil($this->getTotalItems() / $this->maxResults) ?: 1.;
  59. }
  60. /**
  61. * {@inheritdoc}
  62. */
  63. public function getTotalItems(): float
  64. {
  65. return (float) ($this->totalItems ?? $this->totalItems = \count($this->paginator));
  66. }
  67. /**
  68. * {@inheritdoc}
  69. */
  70. public function getQuery(): Query
  71. {
  72. return $this->paginator->getQuery();
  73. }
  74. }