Bug #90822
closedParameter $controllerName in method uriFor of UriBuilder cannot be passed in a correct format
100%
Description
Until TYPO3 9 the method uriFor
required the parameter $controllerName
to be passed in the format of the controller alias. That is the controller class name without the namespace and the Controller suffix. With change Deprecation: #87550 - Use controller classes when registering plugins/modules this does not work anymore because method \TYPO3\CMS\Extbase\Utility\ExtensionUtility::configurePlugin
no longer accepts the class alias as array keys for parameters $controllerActions
and $nonCacheableControllerActions
. Instead it is neccessary to use the fully qualified controller class names.
This change leads to the following structure in $GLOBALS['TYPO3_CONF_VARS']
:
EXTCONF -> extbase -> extensions ->MyExtension -> plugins -> MyPlugin -> controllers -> Vendor\MyExtension\Controller\MyWhateverController
If you call method uriFor
of the UriBuilder
with parameter $controllerName
it passes the parameter to getPluginNameByAction
of ExtensionService
:
if ($pluginName === null && $this->environmentService->isEnvironmentInFrontendMode()) {
$pluginName = $this->extensionService->getPluginNameByAction($extensionName, $controllerArguments['controller'], $controllerArguments['action']);
}
In method getPluginNameByAction
in ExtensionService
there is a comparison between the passed parameter $controllerName
and the controller name from $GLOBALS['TYPO3_CONF_VARS']
:
foreach ($plugins as $pluginName => $pluginConfiguration) {
foreach ($pluginConfiguration['controllers'] ?? [] as $pluginControllerName => $pluginControllerActions) {
if (strtolower($pluginControllerName) !== strtolower($controllerName)) {
continue;
}
if (in_array($actionName, $pluginControllerActions['actions'], true)) {
$pluginNames[] = $pluginName;
}
}
}
If you pass the class alias as parameter $controllerName
in method uriFor
the plugin name can never be set because the comparison always fails. If you pass the parameter $controllerName
as fully qualified controller class name the comparison matches but the controller argument in the resulting link is wrong:
tx_myextension_pi1[controller]=Vendor\MyExtension\Controller\MyWhateverController
There is a mixup or inconsistency of using class alias and fully qualified class names that breaks the usage of parameter $controllerName
in method uriFor
of UriBuilder
.
Updated by Alexander Schnitzler over 4 years ago
- Assignee set to Alexander Schnitzler
Updated by Alexander Schnitzler over 4 years ago
- Status changed from New to Accepted
- Is Regression set to Yes
Updated by Gerrit Code Review over 4 years ago
- Status changed from Accepted to Under Review
Patch set 1 for branch master of project Packages/TYPO3.CMS has been pushed to the review server.
It is available at https://review.typo3.org/c/Packages/TYPO3.CMS/+/63933
Updated by Anonymous over 4 years ago
- Status changed from Under Review to Resolved
- % Done changed from 0 to 100
Applied in changeset 115bff0a09fbd74e7e50c99465e5a8fcedf4fc78.