vendor/sylius/resource-bundle/src/Bundle/Controller/ResourcesCollectionProvider.php line 39

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Bundle\ResourceBundle\Controller;
  12. use Hateoas\Configuration\Route;
  13. use Hateoas\Representation\Factory\PagerfantaFactory;
  14. use Pagerfanta\Pagerfanta;
  15. use Sylius\Bundle\ResourceBundle\Grid\View\ResourceGridView;
  16. use Sylius\Component\Resource\Repository\RepositoryInterface;
  17. final class ResourcesCollectionProvider implements ResourcesCollectionProviderInterface
  18. {
  19.     private ResourcesResolverInterface $resourcesResolver;
  20.     private PagerfantaFactory $pagerfantaRepresentationFactory;
  21.     public function __construct(ResourcesResolverInterface $resourcesResolverPagerfantaFactory $pagerfantaRepresentationFactory)
  22.     {
  23.         $this->resourcesResolver $resourcesResolver;
  24.         $this->pagerfantaRepresentationFactory $pagerfantaRepresentationFactory;
  25.     }
  26.     /**
  27.      * @psalm-suppress MissingReturnType
  28.      */
  29.     public function get(RequestConfiguration $requestConfigurationRepositoryInterface $repository)
  30.     {
  31.         $resources $this->resourcesResolver->getResources($requestConfiguration$repository);
  32.         $paginationLimits = [];
  33.         if ($resources instanceof ResourceGridView) {
  34.             $paginator $resources->getData();
  35.             $paginationLimits $resources->getDefinition()->getLimits();
  36.         } else {
  37.             $paginator $resources;
  38.         }
  39.         if ($paginator instanceof Pagerfanta) {
  40.             $request $requestConfiguration->getRequest();
  41.             $paginator->setMaxPerPage($this->resolveMaxPerPage(
  42.                 $request->query->has('limit') ? $request->query->getInt('limit') : null,
  43.                 $requestConfiguration->getPaginationMaxPerPage(),
  44.                 $paginationLimits,
  45.             ));
  46.             $currentPage = (int) $request->query->get('page''1');
  47.             $paginator->setCurrentPage($currentPage);
  48.             // This prevents Pagerfanta from querying database from a template
  49.             $paginator->getCurrentPageResults();
  50.             if (!$requestConfiguration->isHtmlRequest()) {
  51.                 $route = new Route($request->attributes->get('_route'), array_merge($request->attributes->get('_route_params'), $request->query->all()));
  52.                 return $this->pagerfantaRepresentationFactory->createRepresentation($paginator$route);
  53.             }
  54.         }
  55.         return $resources;
  56.     }
  57.     /**
  58.      * @param int[] $gridLimits
  59.      */
  60.     private function resolveMaxPerPage(?int $requestLimitint $configurationLimit, array $gridLimits = []): int
  61.     {
  62.         if (null === $requestLimit) {
  63.             return reset($gridLimits) ?: $configurationLimit;
  64.         }
  65.         if (!empty($gridLimits)) {
  66.             $maxGridLimit max($gridLimits);
  67.             return $requestLimit $maxGridLimit $maxGridLimit $requestLimit;
  68.         }
  69.         return $requestLimit;
  70.     }
  71. }