| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- <?php
- declare(strict_types=1);
- namespace App\Service\State\Provider;
- use ApiPlatform\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
- use ApiPlatform\Doctrine\Orm\Util\QueryNameGenerator;
- use ApiPlatform\Metadata\Operation;
- use ApiPlatform\State\Pagination\Pagination;
- use ApiPlatform\State\Pagination\TraversablePaginator;
- use Doctrine\ORM\EntityManagerInterface;
- use Doctrine\ORM\Tools\Pagination\Paginator as DoctrinePaginator;
- use Symfony\Component\DependencyInjection\Attribute\AutowireIterator;
- class ProviderUtils
- {
- /**
- * @param iterable<QueryCollectionExtensionInterface> $collectionExtensions
- */
- public function __construct(
- private EntityManagerInterface $em,
- #[AutowireIterator(tag: 'api_platform.doctrine.orm.query_extension.collection')]
- private iterable $collectionExtensions,
- private Pagination $pagination,
- ) {
- }
- /**
- * Applique les extension natives d'api platform (filtres, pagination, etc.).
- *
- * @param array<mixed> $context
- */
- public function applyCollectionExtensionsAndPagination(string $entityClass, Operation $operation, array $context = []): TraversablePaginator
- {
- $qb = $this->em->getRepository($entityClass)->createQueryBuilder('o');
- $queryNameGenerator = new QueryNameGenerator();
- foreach ($this->collectionExtensions as $extension) {
- if ($extension instanceof QueryCollectionExtensionInterface) {
- $extension->applyToCollection(
- $qb,
- $queryNameGenerator,
- $entityClass,
- $operation,
- $context
- );
- }
- }
- $doctrinePaginator = new DoctrinePaginator($qb);
- return new TraversablePaginator(
- $doctrinePaginator,
- $this->pagination->getPage($context),
- $this->pagination->getLimit($operation, $context),
- count($doctrinePaginator) // Nombre total d'éléments pour générer "last", "next", etc.
- );
- }
- /**
- * @param array<mixed> $mappedItems
- */
- public function getTraversablePaginator(array $mappedItems, TraversablePaginator $originalPaginator): TraversablePaginator
- {
- return new TraversablePaginator(
- new \ArrayIterator($mappedItems),
- $originalPaginator->getCurrentPage(),
- $originalPaginator->getItemsPerPage(),
- $originalPaginator->getTotalItems()
- );
- }
- }
|