From 7c4699b2f967d921eeb2bbdc666ee6478038027c Mon Sep 17 00:00:00 2001 From: Alexander Schnitzler <git@alexanderschnitzler.de> Date: Sat, 16 May 2020 19:32:19 +0200 Subject: [PATCH] [BUGFIX] Set controller object name for widget request While introducing the fully qualified controller class names in the extbase plugin configuration the originally used setter \TYPO3\CMS\Extbase\Mvc\Request::setControllerObjectName() has no longer been used to guess extension name, subpackage key and controller name from the class name since all that information is known. Said setter has been kept nevertheless and it was overlooked that it was still used by fluid widgets. This leads to property \TYPO3\CMS\Extbase\Mvc\Request::$controllerObjectName being empty in widget requests which then leads to an exception when trying to create a ClassSchema for the controller object name "". To fix this, the widget request is now created with the controller object name as constructor argument. Releases: master Resolves: #91418 Change-Id: I6abcdb8c68e831459228cc35c3263cec83d16f67 Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64505 Tested-by: Susanne Moog <look@susi.dev> Tested-by: TYPO3com <noreply@typo3.com> Tested-by: Oliver Hader <oliver.hader@typo3.org> Reviewed-by: Susanne Moog <look@susi.dev> Reviewed-by: Oliver Hader <oliver.hader@typo3.org> --- .../Core/Widget/WidgetRequestBuilder.php | 21 ++++++++++--------- .../Core/Widget/WidgetRequestBuilderTest.php | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php b/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php index df84f9632cae..f1e6a861bd05 100644 --- a/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php +++ b/typo3/sysext/fluid/Classes/Core/Widget/WidgetRequestBuilder.php @@ -51,7 +51,17 @@ class WidgetRequestBuilder extends RequestBuilder $baseUri .= TYPO3_mainDir; } - $request = $this->objectManager->get(WidgetRequest::class); + $rawGetArguments = GeneralUtility::_GET(); + if (!isset($rawGetArguments['fluid-widget-id'])) { + // Low level test, WidgetRequestHandler returns false in canHandleRequest () if this is not set + throw new \InvalidArgumentException( + 'No Fluid Widget ID was given.', + 1521190675 + ); + } + $widgetContext = $this->ajaxWidgetContextHolder->get($rawGetArguments['fluid-widget-id']); + + $request = $this->objectManager->get(WidgetRequest::class, $widgetContext->getControllerObjectName()); $request->setRequestUri(GeneralUtility::getIndpEnv('TYPO3_REQUEST_URL')); $request->setBaseUri($baseUri); $request->setMethod($_SERVER['REQUEST_METHOD'] ?? null); @@ -60,18 +70,9 @@ class WidgetRequestBuilder extends RequestBuilder } else { $request->setArguments(GeneralUtility::_GET()); } - $rawGetArguments = GeneralUtility::_GET(); if (isset($rawGetArguments['action'])) { $request->setControllerActionName($rawGetArguments['action']); } - if (!isset($rawGetArguments['fluid-widget-id'])) { - // Low level test, WidgetRequestHandler returns false in canHandleRequest () if this is not set - throw new \InvalidArgumentException( - 'No Fluid Widget ID was given.', - 1521190675 - ); - } - $widgetContext = $this->ajaxWidgetContextHolder->get($rawGetArguments['fluid-widget-id']); $request->setWidgetContext($widgetContext); return $request; } diff --git a/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php b/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php index 4bd353ef4928..0956beb11eb8 100644 --- a/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php +++ b/typo3/sysext/fluid/Tests/Unit/Core/Widget/WidgetRequestBuilderTest.php @@ -60,7 +60,7 @@ class WidgetRequestBuilderTest extends UnitTestCase $this->widgetRequestBuilder = $this->getAccessibleMock(WidgetRequestBuilder::class, ['setArgumentsFromRawRequestData']); $this->mockWidgetRequest = $this->createMock(WidgetRequest::class); $this->mockObjectManager = $this->createMock(ObjectManagerInterface::class); - $this->mockObjectManager->expects(self::once())->method('get')->with(WidgetRequest::class)->willReturn($this->mockWidgetRequest); + $this->mockObjectManager->expects(self::any())->method('get')->with(WidgetRequest::class)->willReturn($this->mockWidgetRequest); $this->widgetRequestBuilder->_set('objectManager', $this->mockObjectManager); $this->mockWidgetContext = $this->createMock(WidgetContext::class); $this->mockAjaxWidgetContextHolder = $this->createMock(AjaxWidgetContextHolder::class); -- GitLab