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