diff --git a/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php b/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php index 745b8b718987f5fc29c11e7f34a585b1dee088c9..7af253021371e84d5ef33a70c9a23477696d95ac 100644 --- a/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php +++ b/typo3/sysext/core/Classes/Routing/Enhancer/SimpleEnhancer.php @@ -51,23 +51,22 @@ class SimpleEnhancer extends AbstractEnhancer implements RoutingEnhancerInterfac */ public function buildResult(Route $route, array $results, array $remainingQueryParameters = []): PageArguments { - $variableProcessor = $this->getVariableProcessor(); // determine those parameters that have been processed $parameters = array_intersect_key( $results, array_flip($route->compile()->getPathVariables()) ); // strip of those that where not processed (internals like _route, etc.) + $internals = array_diff_key($results, $parameters); $matchedVariableNames = array_keys($parameters); $staticMappers = $route->filterAspects([StaticMappableAspectInterface::class], $matchedVariableNames); $dynamicCandidates = array_diff_key($parameters, $staticMappers); // all route arguments - $routeArguments = $variableProcessor->inflateParameters($parameters, $route->getArguments()); + $routeArguments = $this->inflateParameters($parameters, $internals); // dynamic arguments, that don't have a static mapper - $dynamicArguments = $variableProcessor - ->inflateNamespaceParameters($dynamicCandidates, ''); + $dynamicArguments = $this->inflateParameters($dynamicCandidates); // route arguments, that don't appear in dynamic arguments $staticArguments = ArrayUtility::arrayDiffKeyRecursive($routeArguments, $dynamicArguments); @@ -142,7 +141,6 @@ class SimpleEnhancer extends AbstractEnhancer implements RoutingEnhancerInterfac public function inflateParameters(array $parameters, array $internals = []): array { - return $this->getVariableProcessor() - ->inflateNamespaceParameters($parameters, ''); + return $this->getVariableProcessor()->inflateParameters($parameters, $internals); } } diff --git a/typo3/sysext/frontend/Tests/Functional/SiteHandling/Fixtures/LinkHandlingController.php b/typo3/sysext/frontend/Tests/Functional/SiteHandling/Fixtures/LinkHandlingController.php index ba3033c213f31b7415ce6b51d4c19bdcbaaa1ff6..0c3a11534cd4f29ebc030f9c1a1e1bc4aaaa7f95 100644 --- a/typo3/sysext/frontend/Tests/Functional/SiteHandling/Fixtures/LinkHandlingController.php +++ b/typo3/sysext/frontend/Tests/Functional/SiteHandling/Fixtures/LinkHandlingController.php @@ -58,9 +58,11 @@ class LinkHandlingController } /** + * @param string|null $content + * @param array|null $configuration * @return string */ - public function dumpPageArgumentsAction(): string + public function dumpPageArgumentsAction(?string $content, array $configuration = null): string { /** @var ServerRequestInterface $request */ $request = $GLOBALS['TYPO3_REQUEST']; @@ -68,15 +70,20 @@ class LinkHandlingController $pageArguments = $request->getAttribute('routing'); /** @var SiteLanguage $language */ $language = $request->getAttribute('language'); + $flags = 0; + if ($configuration['userFunc.']['prettyPrint'] ?? true) { + $flags += JSON_PRETTY_PRINT; + } return json_encode([ 'pageId' => $pageArguments->getPageId(), 'pageType' => $pageArguments->getPageType(), 'languageId' => $language->getLanguageId(), - 'dynamicArguments' => $pageArguments->getDynamicArguments(), 'staticArguments' => $pageArguments->getStaticArguments(), + 'routeArguments' => $pageArguments->getRouteArguments(), + 'dynamicArguments' => $pageArguments->getDynamicArguments(), 'queryArguments' => $pageArguments->getQueryArguments(), 'requestQueryParams' => $request->getQueryParams(), '_GET' => $_GET, - ]); + ], $flags); } } diff --git a/typo3/sysext/frontend/Tests/Functional/SiteHandling/Framework/Builder/Builder.php b/typo3/sysext/frontend/Tests/Functional/SiteHandling/Framework/Builder/Builder.php index 05daa95b18d35a7f318a1d6e5d8b588f74ed0edb..a5584682fc15f05c7923d4e85e5da81d12f58b32 100644 --- a/typo3/sysext/frontend/Tests/Functional/SiteHandling/Framework/Builder/Builder.php +++ b/typo3/sysext/frontend/Tests/Functional/SiteHandling/Framework/Builder/Builder.php @@ -230,6 +230,11 @@ class Builder $resolveArguments['staticArguments'] = $resolveArguments['staticArguments'] ?? []; $resolveArguments['dynamicArguments'] = $resolveArguments['dynamicArguments'] ?? []; $resolveArguments['queryArguments'] = $resolveArguments['queryArguments'] ?? []; + // generate ("assume") `routeArguments` from expected static and dynamic arguments if not declared + $resolveArguments['routeArguments'] = $resolveArguments['routeArguments'] ?? array_replace_recursive( + $resolveArguments['staticArguments'], + $resolveArguments['dynamicArguments'] + ); if (preg_match('#\?cHash=([a-z0-9]+)#i', $this->compileUrl($testSet), $matches)) { $resolveArguments['dynamicArguments']['cHash'] = $matches[1]; $resolveArguments['queryArguments']['cHash'] = $matches[1]; diff --git a/typo3/sysext/frontend/Tests/Functional/SiteHandling/TestSetDataProviderTrait.php b/typo3/sysext/frontend/Tests/Functional/SiteHandling/TestSetDataProviderTrait.php index bd6ad6b97663a231ab5d212a008a7d565bbfbf54..db96146801bc763e219d9411f360196fb7f37b8a 100644 --- a/typo3/sysext/frontend/Tests/Functional/SiteHandling/TestSetDataProviderTrait.php +++ b/typo3/sysext/frontend/Tests/Functional/SiteHandling/TestSetDataProviderTrait.php @@ -61,18 +61,16 @@ trait TestSetDataProviderTrait ->withRequiredDefinedVariableNames('value'), ]) ->withResolveArguments([ + 'routeArguments' => [ + 'known' => ['value' => $resolveValueVar], + ], 'dynamicArguments' => [ - // @todo Wrong - 'any__other' => 'other', + 'known' => ['value' => $resolveValueVar], + 'any' => ['other' => 'other'], 'cHash' => $cHashVar, ], - 'staticArguments' => [ - // @todo Wrong - 'known_value' => 'known', - ], 'queryArguments' => [ - // @todo Wrong - 'any__other' => 'other', + 'any' => ['other' => 'other'], 'cHash' => $cHashVar, ], ]), @@ -90,6 +88,11 @@ trait TestSetDataProviderTrait ->withRequiredDefinedVariableNames('value'), ]) ->withResolveArguments([ + 'routeArguments' => [ + 'testing' => [ + 'known' => ['value' => $resolveValueVar], + ], + ], 'dynamicArguments' => [ 'testing' => [ 'known' => ['value' => $resolveValueVar], @@ -123,6 +126,13 @@ trait TestSetDataProviderTrait ->withRequiredDefinedVariableNames('value'), ]) ->withResolveArguments([ + 'routeArguments' => [ + 'tx_testing_link' => [ + 'known' => ['value' => $resolveValueVar], + 'controller' => 'Link', + 'action' => 'index', + ], + ], 'dynamicArguments' => [ 'tx_testing_link' => [ 'known' => ['value' => $resolveValueVar], @@ -166,9 +176,8 @@ trait TestSetDataProviderTrait ->withApplicableItems($enhancers) ->withApplicableSet( VariablesContext::create(Variables::create([ - // @todo Should be '?any%5Bother%5D=other&cHash=' - 'pathSuffix' => '?any__other=other&cHash=[[cHash]]', - 'cHash' => '02ee401c0a183d11d30b7a61deeb3361', + 'pathSuffix' => '?any%5Bother%5D=other&cHash=[[cHash]]', + 'cHash' => 'a655d1f1d346f7d3fa7aef5459a6547f', ]))->withRequiredApplicables($enhancers['Simple']), VariablesContext::create(Variables::create([ 'pathSuffix' => '?testing%5Bany%5D%5Bother%5D=other&cHash=[[cHash]]',