diff --git a/src/JsonApi/State/JsonApiProvider.php b/src/JsonApi/State/JsonApiProvider.php index bf86cb406de..92936e0717c 100644 --- a/src/JsonApi/State/JsonApiProvider.php +++ b/src/JsonApi/State/JsonApiProvider.php @@ -60,7 +60,7 @@ public function provide(Operation $operation, array $uriVariables = [], array $c $filterParameter && \is_array($filterParameter) ) { - $filters = array_merge($filterParameter, $filters); + $filters = array_merge(['page' => $filterParameter], $filterParameter, $filters); } $pageParameter = $queryParameters['page'] ?? null; diff --git a/src/State/Pagination/Pagination.php b/src/State/Pagination/Pagination.php index 9d070631122..45ba61000a9 100644 --- a/src/State/Pagination/Pagination.php +++ b/src/State/Pagination/Pagination.php @@ -219,13 +219,28 @@ private function getGraphQlEnabled(?Operation $operation): bool return $operation?->getPaginationEnabled() ?? $enabled; } + private function extractParameter(array $contextFilters, string $parameterName) + { + \preg_match_all("/[\w-]+/", $parameterName, $matches); + + foreach($matches[0] as $key){ + if (!\array_key_exists($key, $contextFilters)) { + return null; + } + $contextFilters = $contextFilters[$key]; + } + + return $contextFilters; + } + /** * Gets the given pagination parameter name from the given context. */ private function getParameterFromContext(array $context, string $parameterName, mixed $default = null) { $filters = $context['filters'] ?? []; + $filterValue = $this->extractParameter($filters, $parameterName); - return \array_key_exists($parameterName, $filters) ? $filters[$parameterName] : $default; + return $filterValue ?? $default; } }