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

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.     /** @var ResourcesResolverInterface */
  20.     private $resourcesResolver;
  21.     /** @var PagerfantaFactory */
  22.     private $pagerfantaRepresentationFactory;
  23.     public function __construct(ResourcesResolverInterface $resourcesResolverPagerfantaFactory $pagerfantaRepresentationFactory)
  24.     {
  25.         $this->resourcesResolver $resourcesResolver;
  26.         $this->pagerfantaRepresentationFactory $pagerfantaRepresentationFactory;
  27.     }
  28.     /**
  29.      * @psalm-suppress MissingReturnType
  30.      */
  31.     public function get(RequestConfiguration $requestConfigurationRepositoryInterface $repository)
  32.     {
  33.         $resources $this->resourcesResolver->getResources($requestConfiguration$repository);
  34.         $paginationLimits = [];
  35.         if ($resources instanceof ResourceGridView) {
  36.             $paginator $resources->getData();
  37.             $paginationLimits $resources->getDefinition()->getLimits();
  38.         } else {
  39.             $paginator $resources;
  40.         }
  41.         if ($paginator instanceof Pagerfanta) {
  42.             $request $requestConfiguration->getRequest();
  43.             $paginator->setMaxPerPage($this->resolveMaxPerPage(
  44.                 $request->query->has('limit') ? $request->query->getInt('limit') : null,
  45.                 $requestConfiguration->getPaginationMaxPerPage(),
  46.                 $paginationLimits
  47.             ));
  48.             $currentPage = (int) $request->query->get('page''1');
  49.             $paginator->setCurrentPage($currentPage);
  50.             // This prevents Pagerfanta from querying database from a template
  51.             $paginator->getCurrentPageResults();
  52.             if (!$requestConfiguration->isHtmlRequest()) {
  53.                 $route = new Route($request->attributes->get('_route'), array_merge($request->attributes->get('_route_params'), $request->query->all()));
  54.                 return $this->pagerfantaRepresentationFactory->createRepresentation($paginator$route);
  55.             }
  56.         }
  57.         return $resources;
  58.     }
  59.     /**
  60.      * @param int[] $gridLimits
  61.      */
  62.     private function resolveMaxPerPage(?int $requestLimitint $configurationLimit, array $gridLimits = []): int
  63.     {
  64.         if (null === $requestLimit) {
  65.             return reset($gridLimits) ?: $configurationLimit;
  66.         }
  67.         if (!empty($gridLimits)) {
  68.             $maxGridLimit max($gridLimits);
  69.             return $requestLimit $maxGridLimit $maxGridLimit $requestLimit;
  70.         }
  71.         return $requestLimit;
  72.     }
  73. }