From b8bb71f6bc4bbb9f87a046119bfe4236a4f3d7d5 Mon Sep 17 00:00:00 2001 From: Christian Kuhn <lolli@schwarzbu.ch> Date: Tue, 24 Aug 2021 09:56:25 +0200 Subject: [PATCH] [TASK] Simplify TemplateView inheritance chain The fluid view classes have a rather complex inheritance and dependency chain, especially when looking at the various extbase related classes, too. One step is TYPO3Fluid\Fluid\View\TemplateView: This empty class adds no value, TYPO3\CMS\Fluid\View\AbstractTemplateView can extend TYPO3Fluid\Fluid\View\AbstractTemplateView instead, without functional change. Resolves: #94973 Releases: master Change-Id: I41888b371d69ca70deb30ff0d47028d4c8e0e6ff Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/70734 Tested-by: Benni Mack <benni@typo3.org> Tested-by: core-ci <typo3@b13.com> Tested-by: Jochen <rothjochen@gmail.com> Tested-by: Christian Kuhn <lolli@schwarzbu.ch> Reviewed-by: Benni Mack <benni@typo3.org> Reviewed-by: Jochen <rothjochen@gmail.com> Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch> --- .../Classes/Controller/ErrorPageController.php | 1 + .../Classes/Mvc/Controller/ActionController.php | 9 +++++---- .../Unit/Mvc/Controller/ActionControllerTest.php | 4 ++-- .../fluid/Classes/View/AbstractTemplateView.php | 4 ++-- .../FluidTemplateContentObjectTest.php | 14 ++++++++------ 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/typo3/sysext/core/Classes/Controller/ErrorPageController.php b/typo3/sysext/core/Classes/Controller/ErrorPageController.php index 9e3a5125cec9..6333e15bf66e 100644 --- a/typo3/sysext/core/Classes/Controller/ErrorPageController.php +++ b/typo3/sysext/core/Classes/Controller/ErrorPageController.php @@ -47,6 +47,7 @@ class ErrorPageController */ public function __construct() { + // @todo: Change to StandaloneView when StandaloneView has less dependencies. $this->view = GeneralUtility::makeInstance(TemplateView::class); $this->view->getRenderingContext() ->getTemplatePaths() diff --git a/typo3/sysext/extbase/Classes/Mvc/Controller/ActionController.php b/typo3/sysext/extbase/Classes/Mvc/Controller/ActionController.php index 81516b2406d0..458e53945148 100644 --- a/typo3/sysext/extbase/Classes/Mvc/Controller/ActionController.php +++ b/typo3/sysext/extbase/Classes/Mvc/Controller/ActionController.php @@ -56,7 +56,8 @@ use TYPO3\CMS\Extbase\SignalSlot\Dispatcher; use TYPO3\CMS\Extbase\Validation\Validator\ConjunctionValidator; use TYPO3\CMS\Extbase\Validation\Validator\ValidatorInterface; use TYPO3\CMS\Extbase\Validation\ValidatorResolver; -use TYPO3Fluid\Fluid\View\TemplateView; +use TYPO3\CMS\Fluid\View\TemplateView; +use TYPO3Fluid\Fluid\View\AbstractTemplateView; /** * A multi action controller. This is by far the most common base class for Controllers. @@ -99,7 +100,7 @@ abstract class ActionController implements ControllerInterface * * @var string */ - protected $defaultViewObjectName = \TYPO3\CMS\Fluid\View\TemplateView::class; + protected $defaultViewObjectName = TemplateView::class; /** * Name of the action method @@ -497,8 +498,8 @@ abstract class ActionController implements ControllerInterface */ protected function renderAssetsForRequest($request) { - if (!$this->view instanceof TemplateView) { - // Only TemplateView (from Fluid engine, so this includes all TYPO3 Views based + if (!$this->view instanceof AbstractTemplateView) { + // Only AbstractTemplateView (from Fluid engine, so this includes all TYPO3 Views based // on TYPO3's AbstractTemplateView) supports renderSection(). The method is not // declared on ViewInterface - so we must assert a specific class. We silently skip // asset processing if the View doesn't match, so we don't risk breaking custom Views. diff --git a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ActionControllerTest.php b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ActionControllerTest.php index b1cc18ba8f86..fc155eaa0a40 100644 --- a/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ActionControllerTest.php +++ b/typo3/sysext/extbase/Tests/Unit/Mvc/Controller/ActionControllerTest.php @@ -37,7 +37,7 @@ use TYPO3\CMS\Extbase\Reflection\ClassSchema\Method; use TYPO3\CMS\Extbase\Reflection\ReflectionService; use TYPO3\CMS\Extbase\Service\ExtensionService; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; -use TYPO3Fluid\Fluid\View\AbstractTemplateView; +use TYPO3Fluid\Fluid\View\AbstractView; use TYPO3Fluid\Fluid\View\TemplateView as FluidTemplateView; /** @@ -588,7 +588,7 @@ class ActionControllerTest extends UnitTestCase ['FooterAssets', self::anything(), true] ) ->willReturnOnConsecutiveCalls('custom-header-data', 'custom-footer-data'); - $invalidView = $this->getMockBuilder(AbstractTemplateView::class)->disableOriginalConstructor()->getMockForAbstractClass(); + $invalidView = $this->getMockBuilder(AbstractView::class)->disableOriginalConstructor()->getMockForAbstractClass(); return [ [$viewWithHeaderData, 'custom-header-data', null], [$viewWithFooterData, null, 'custom-footer-data'], diff --git a/typo3/sysext/fluid/Classes/View/AbstractTemplateView.php b/typo3/sysext/fluid/Classes/View/AbstractTemplateView.php index bee7b7db3d01..b34451946b11 100644 --- a/typo3/sysext/fluid/Classes/View/AbstractTemplateView.php +++ b/typo3/sysext/fluid/Classes/View/AbstractTemplateView.php @@ -21,15 +21,15 @@ use TYPO3\CMS\Extbase\Mvc\View\ViewInterface; use TYPO3\CMS\Fluid\Core\Rendering\RenderingContext; use TYPO3\CMS\Fluid\Core\Rendering\RenderingContextFactory; use TYPO3Fluid\Fluid\Core\Rendering\RenderingContextInterface; +use TYPO3Fluid\Fluid\View\AbstractTemplateView as Typo3FluidAbstractTemplateView; use TYPO3Fluid\Fluid\View\Exception\InvalidTemplateResourceException; -use TYPO3Fluid\Fluid\View\TemplateView; /** * Abstract Fluid Template View. * * Contains the fundamental methods which any Fluid based template view needs. */ -abstract class AbstractTemplateView extends TemplateView implements ViewInterface +abstract class AbstractTemplateView extends Typo3FluidAbstractTemplateView implements ViewInterface { /** * @var \TYPO3\CMS\Extbase\Mvc\Controller\ControllerContext diff --git a/typo3/sysext/frontend/Tests/Unit/ContentObject/FluidTemplateContentObjectTest.php b/typo3/sysext/frontend/Tests/Unit/ContentObject/FluidTemplateContentObjectTest.php index 459e880cbb7f..4558bfd60cce 100644 --- a/typo3/sysext/frontend/Tests/Unit/ContentObject/FluidTemplateContentObjectTest.php +++ b/typo3/sysext/frontend/Tests/Unit/ContentObject/FluidTemplateContentObjectTest.php @@ -18,6 +18,7 @@ declare(strict_types=1); namespace TYPO3\CMS\Frontend\Tests\Unit\ContentObject; use Prophecy\Argument; +use Prophecy\PhpUnit\ProphecyTrait; use TYPO3\CMS\Core\Core\Environment; use TYPO3\CMS\Core\Page\PageRenderer; use TYPO3\CMS\Core\TypoScript\TemplateService; @@ -29,14 +30,15 @@ use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer; use TYPO3\CMS\Frontend\ContentObject\FluidTemplateContentObject; use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; use TYPO3\TestingFramework\Core\Unit\UnitTestCase; -use TYPO3Fluid\Fluid\View\TemplateView; +use TYPO3Fluid\Fluid\View\AbstractTemplateView; /** * Testcase */ class FluidTemplateContentObjectTest extends UnitTestCase { - use \Prophecy\PhpUnit\ProphecyTrait; + use ProphecyTrait; + /** * @var bool Reset singletons created by subject */ @@ -942,7 +944,7 @@ class FluidTemplateContentObjectTest extends UnitTestCase } /** - * @param TemplateView $viewMock + * @param AbstractTemplateView $viewMock * @param string|null $expectedHeader * @param string|null $expectedFooter * @test @@ -983,7 +985,7 @@ class FluidTemplateContentObjectTest extends UnitTestCase */ public function headerAssetDataProvider(): array { - $viewWithHeaderData = $this->getMockBuilder(TemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock(); + $viewWithHeaderData = $this->getMockBuilder(AbstractTemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock(); $viewWithHeaderData->expects(self::exactly(2))->method('renderSection') ->withConsecutive( [ @@ -997,7 +999,7 @@ class FluidTemplateContentObjectTest extends UnitTestCase true ] )->willReturnOnConsecutiveCalls('custom-header-data', null); - $viewWithFooterData = $this->getMockBuilder(TemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock(); + $viewWithFooterData = $this->getMockBuilder(AbstractTemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock(); $viewWithFooterData->expects(self::exactly(2))->method('renderSection') ->withConsecutive( [ @@ -1009,7 +1011,7 @@ class FluidTemplateContentObjectTest extends UnitTestCase self::anything(), true] )->willReturn(null, 'custom-footer-data'); - $viewWithBothData = $this->getMockBuilder(TemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock(); + $viewWithBothData = $this->getMockBuilder(AbstractTemplateView::class)->onlyMethods(['renderSection'])->disableOriginalConstructor()->getMock(); $viewWithBothData->expects(self::exactly(2))->method('renderSection') ->withConsecutive( [ -- GitLab