1 | <?php |
||
31 | class PaginationExtension implements QueryResultExtensionInterface |
||
32 | { |
||
33 | private $managerRegistry; |
||
34 | private $requestStack; |
||
35 | private $resourceMetadataFactory; |
||
36 | private $enabled; |
||
37 | private $clientEnabled; |
||
38 | private $clientItemsPerPage; |
||
39 | private $itemsPerPage; |
||
40 | private $pageParameterName; |
||
41 | private $enabledParameterName; |
||
42 | private $itemsPerPageParameterName; |
||
43 | private $maximumItemPerPage; |
||
44 | |||
45 | public function __construct(ManagerRegistry $managerRegistry, RequestStack $requestStack, ResourceMetadataFactoryInterface $resourceMetadataFactory, bool $enabled = true, bool $clientEnabled = false, bool $clientItemsPerPage = false, int $itemsPerPage = 30, string $pageParameterName = 'page', string $enabledParameterName = 'pagination', string $itemsPerPageParameterName = 'itemsPerPage', int $maximumItemPerPage = null) |
||
59 | |||
60 | /** |
||
61 | * {@inheritdoc} |
||
62 | */ |
||
63 | public function applyToCollection(QueryBuilder $queryBuilder, QueryNameGeneratorInterface $queryNameGenerator, string $resourceClass, string $operationName = null) |
||
64 | { |
||
65 | $request = $this->requestStack->getCurrentRequest(); |
||
66 | if (null === $request) { |
||
67 | return; |
||
68 | } |
||
69 | |||
70 | $resourceMetadata = $this->resourceMetadataFactory->create($resourceClass); |
||
71 | if (!$this->isPaginationEnabled($request, $resourceMetadata, $operationName)) { |
||
72 | return; |
||
73 | } |
||
74 | |||
75 | $itemsPerPage = $resourceMetadata->getCollectionOperationAttribute($operationName, 'pagination_items_per_page', $this->itemsPerPage, true); |
||
76 | if ($resourceMetadata->getCollectionOperationAttribute($operationName, 'pagination_client_items_per_page', $this->clientItemsPerPage, true)) { |
||
77 | $itemsPerPage = (int) $request->query->get($this->itemsPerPageParameterName, $itemsPerPage); |
||
78 | $itemsPerPage = (null !== $this->maximumItemPerPage && $itemsPerPage >= $this->maximumItemPerPage ? $this->maximumItemPerPage : $itemsPerPage); |
||
79 | } |
||
80 | |||
81 | $queryBuilder |
||
82 | ->setFirstResult(($request->query->get($this->pageParameterName, 1) - 1) * $itemsPerPage) |
||
83 | ->setMaxResults($itemsPerPage); |
||
84 | } |
||
85 | |||
86 | /** |
||
87 | * {@inheritdoc} |
||
88 | */ |
||
89 | public function supportsResult(string $resourceClass, string $operationName = null) : bool |
||
100 | |||
101 | /** |
||
102 | * {@inheritdoc} |
||
103 | */ |
||
104 | public function getResult(QueryBuilder $queryBuilder) |
||
111 | |||
112 | private function isPaginationEnabled(Request $request, ResourceMetadata $resourceMetadata, string $operationName = null) : bool |
||
123 | |||
124 | /** |
||
125 | * Determines whether the Paginator should fetch join collections, if the root entity uses composite identifiers it should not. |
||
126 | * |
||
127 | * @see https://github.com/doctrine/doctrine2/issues/2910 |
||
128 | * |
||
129 | * @param QueryBuilder $queryBuilder |
||
130 | * |
||
131 | * @return bool |
||
132 | */ |
||
133 | private function useFetchJoinCollection(QueryBuilder $queryBuilder): bool |
||
137 | |||
138 | /** |
||
139 | * Determines whether output walkers should be used. |
||
140 | * |
||
141 | * @param QueryBuilder $queryBuilder |
||
142 | * |
||
143 | * @return bool |
||
144 | */ |
||
145 | private function useOutputWalkers(QueryBuilder $queryBuilder) : bool |
||
187 | } |
||
188 |