ProviderUtils.php 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service\State\Provider;
  4. use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
  5. use ApiPlatform\Doctrine\Orm\Util\QueryNameGenerator;
  6. use ApiPlatform\Metadata\Operation;
  7. use ApiPlatform\State\Pagination\Pagination;
  8. use ApiPlatform\State\Pagination\TraversablePaginator;
  9. use Doctrine\ORM\EntityManagerInterface;
  10. use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
  11. use Symfony\Component\DependencyInjection\Attribute\AutowireIterator;
  12. class ProviderUtils
  13. {
  14. /**
  15. * @param iterable<QueryCollectionExtensionInterface> $collectionExtensions
  16. */
  17. public function __construct(
  18. private EntityManagerInterface $em,
  19. #[AutowireIterator(tag: 'api_platform.doctrine.orm.query_extension.collection')]
  20. private iterable $collectionExtensions,
  21. private Pagination $pagination,
  22. ) {
  23. }
  24. /**
  25. * Applique les extension natives d'api platform (filtres, pagination, etc.).
  26. *
  27. * @param array<mixed> $context
  28. */
  29. public function applyCollectionExtensionsAndPagination(string $entityClass, Operation $operation, array $context = []): TraversablePaginator
  30. {
  31. $qb = $this->em->getRepository($entityClass)->createQueryBuilder('o');
  32. $queryNameGenerator = new QueryNameGenerator();
  33. foreach ($this->collectionExtensions as $extension) {
  34. if ($extension instanceof QueryCollectionExtensionInterface) {
  35. $extension->applyToCollection(
  36. $qb,
  37. $queryNameGenerator,
  38. $entityClass,
  39. $operation,
  40. $context
  41. );
  42. }
  43. }
  44. $doctrinePaginator = new DoctrinePaginator($qb);
  45. return new TraversablePaginator(
  46. $doctrinePaginator,
  47. $this->pagination->getPage($context),
  48. $this->pagination->getLimit($operation, $context),
  49. count($doctrinePaginator) // Nombre total d'éléments pour générer "last", "next", etc.
  50. );
  51. }
  52. /**
  53. * @param array<mixed> $mappedItems
  54. */
  55. public function getTraversablePaginator(array $mappedItems, TraversablePaginator $originalPaginator): TraversablePaginator
  56. {
  57. return new TraversablePaginator(
  58. new \ArrayIterator($mappedItems),
  59. $originalPaginator->getCurrentPage(),
  60. $originalPaginator->getItemsPerPage(),
  61. $originalPaginator->getTotalItems()
  62. );
  63. }
  64. }