From e9aca9b2337094b20a92f2e946e871ae6aad1280 Mon Sep 17 00:00:00 2001
From: Christian Kuhn <lolli@schwarzbu.ch>
Date: Fri, 6 Oct 2017 15:58:43 +0200
Subject: [PATCH] [!!!][TASK] Deprecate ext:backend class AbstractModule

The internal / experimental class ext:backend/Module/AbstractModule
doesn't do much useful stuff: It only instantiates ModuleTemplate
in it's constructor which forces all inheriting classes to call
parent::__construct(). The processRequest() method with its
dispatcher code is never used in core, but superseeded by routing
configuration via Configuration/Backend/Routes.php.

The patch removes given AbstractModule usages and markes the
class as deprecated. The patch is slightly breaking in cases
an extension extends AbstractWizardController and additionally
uses the initialized moduleTemplate property.

Change-Id: Iee36e1787a6dc2a1affb3625983ccb6450589481
Resolves: #82689
Releases: master
Reviewed-on: https://review.typo3.org/54312
Reviewed-by: Andreas Fernandez <typo3@scripting-base.de>
Tested-by: Andreas Fernandez <typo3@scripting-base.de>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
---
 .../ElementHistoryController.php              | 13 ++++--
 .../ContentElement/MoveElementController.php  | 13 ++++--
 .../NewContentElementController.php           | 13 ++++--
 .../Controller/EditDocumentController.php     | 13 ++++--
 .../File/CreateFolderController.php           | 13 ++++--
 .../Controller/File/EditFileController.php    | 13 ++++--
 .../Controller/File/FileUploadController.php  | 13 ++++--
 .../Controller/File/RenameFileController.php  | 13 ++++--
 .../Controller/File/ReplaceFileController.php | 13 ++++--
 .../Controller/NewRecordController.php        | 13 ++++--
 .../Wizard/AbstractWizardController.php       |  3 +-
 .../Controller/Wizard/AddController.php       |  1 -
 .../Controller/Wizard/EditController.php      |  1 -
 .../Controller/Wizard/ListController.php      |  1 -
 .../Controller/Wizard/TableController.php     | 10 ++++-
 .../backend/Classes/Module/AbstractModule.php |  6 +++
 ...zardControllerNotExtendsAbstractModule.rst | 44 +++++++++++++++++++
 .../ExtensionScanner/Php/ClassNameMatcher.php |  5 +++
 .../Classes/Report/LinkValidatorReport.php    |  2 -
 .../sysext/recordlist/Classes/RecordList.php  | 12 +++--
 .../Controller/SetupModuleController.php      | 13 ++++--
 21 files changed, 184 insertions(+), 44 deletions(-)
 create mode 100644 typo3/sysext/core/Documentation/Changelog/master/Breaking-82689-BackendAbstractWizardControllerNotExtendsAbstractModule.rst

diff --git a/typo3/sysext/backend/Classes/Controller/ContentElement/ElementHistoryController.php b/typo3/sysext/backend/Classes/Controller/ContentElement/ElementHistoryController.php
index e45a75080b8a..8f8a4f5d3421 100644
--- a/typo3/sysext/backend/Classes/Controller/ContentElement/ElementHistoryController.php
+++ b/typo3/sysext/backend/Classes/Controller/ContentElement/ElementHistoryController.php
@@ -17,8 +17,8 @@ namespace TYPO3\CMS\Backend\Controller\ContentElement;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\History\RecordHistory;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\History\RecordHistoryStore;
 use TYPO3\CMS\Core\Imaging\Icon;
@@ -30,7 +30,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
  * Controller for showing the history module of TYPO3s backend
  * @see \TYPO3\CMS\Backend\History\RecordHistory
  */
-class ElementHistoryController extends AbstractModule
+class ElementHistoryController
 {
     /**
      * @var ServerRequestInterface
@@ -59,12 +59,19 @@ class ElementHistoryController extends AbstractModule
      */
     protected $recordCache = [];
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->view = $this->initializeView();
     }
 
diff --git a/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php b/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php
index f7fc1df261d1..615047515ebd 100644
--- a/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php
+++ b/typo3/sysext/backend/Classes/Controller/ContentElement/MoveElementController.php
@@ -16,7 +16,7 @@ namespace TYPO3\CMS\Backend\Controller\ContentElement;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Tree\View\ContentMovingPagePositionMap;
 use TYPO3\CMS\Backend\Tree\View\PageMovingPagePositionMap;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
@@ -27,7 +27,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
 /**
  * Script Class for rendering the move-element wizard display
  */
-class MoveElementController extends AbstractModule
+class MoveElementController
 {
     /**
      * @var int
@@ -78,12 +78,19 @@ class MoveElementController extends AbstractModule
      */
     public $content;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_misc.xlf');
         $GLOBALS['SOBE'] = $this;
         $this->init();
diff --git a/typo3/sysext/backend/Classes/Controller/ContentElement/NewContentElementController.php b/typo3/sysext/backend/Classes/Controller/ContentElement/NewContentElementController.php
index a0b1b9cb6975..c15b79ea43d9 100644
--- a/typo3/sysext/backend/Classes/Controller/ContentElement/NewContentElementController.php
+++ b/typo3/sysext/backend/Classes/Controller/ContentElement/NewContentElementController.php
@@ -16,8 +16,8 @@ namespace TYPO3\CMS\Backend\Controller\ContentElement;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\DocumentTemplate;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Backend\View\BackendLayoutView;
 use TYPO3\CMS\Backend\Wizard\NewContentElementWizardHookInterface;
@@ -30,7 +30,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
 /**
  * Script Class for the New Content element wizard
  */
-class NewContentElementController extends AbstractModule
+class NewContentElementController
 {
     /**
      * Page id
@@ -125,12 +125,19 @@ class NewContentElementController extends AbstractModule
      */
     protected $menuItemView;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->view = $this->getFluidTemplateObject();
         $this->menuItemView = $this->getFluidTemplateObject('MenuItem.html');
diff --git a/typo3/sysext/backend/Classes/Controller/EditDocumentController.php b/typo3/sysext/backend/Classes/Controller/EditDocumentController.php
index 567490b77d61..89f71b6fced5 100644
--- a/typo3/sysext/backend/Classes/Controller/EditDocumentController.php
+++ b/typo3/sysext/backend/Classes/Controller/EditDocumentController.php
@@ -22,8 +22,8 @@ use TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord;
 use TYPO3\CMS\Backend\Form\FormResultCompiler;
 use TYPO3\CMS\Backend\Form\NodeFactory;
 use TYPO3\CMS\Backend\Form\Utility\FormEngineUtility;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Database\ConnectionPool;
 use TYPO3\CMS\Core\Database\Query\Restriction\BackendWorkspaceRestriction;
@@ -48,7 +48,7 @@ use TYPO3\CMS\Frontend\Page\PageRepository;
  * Script Class: Drawing the editing form for editing records in TYPO3.
  * Notice: It does NOT use tce_db.php to submit data to, rather it handles submissions itself
  */
-class EditDocumentController extends AbstractModule
+class EditDocumentController
 {
     const DOCUMENT_CLOSE_MODE_DEFAULT = 0;
     const DOCUMENT_CLOSE_MODE_REDIRECT = 1; // works like DOCUMENT_CLOSE_MODE_DEFAULT
@@ -399,12 +399,19 @@ class EditDocumentController extends AbstractModule
      */
     protected $previewData = [];
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->moduleTemplate->setUiBlock(true);
         $GLOBALS['SOBE'] = $this;
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_alt_doc.xlf');
diff --git a/typo3/sysext/backend/Classes/Controller/File/CreateFolderController.php b/typo3/sysext/backend/Classes/Controller/File/CreateFolderController.php
index 901234821664..ffc74c2b9907 100644
--- a/typo3/sysext/backend/Classes/Controller/File/CreateFolderController.php
+++ b/typo3/sysext/backend/Classes/Controller/File/CreateFolderController.php
@@ -16,7 +16,7 @@ namespace TYPO3\CMS\Backend\Controller\File;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException;
@@ -31,7 +31,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
  *
  * Displays forms for creating folders (1 to 10), a media asset or a new file.
  */
-class CreateFolderController extends AbstractModule
+class CreateFolderController
 {
     /**
      * @var int
@@ -83,12 +83,19 @@ class CreateFolderController extends AbstractModule
      */
     public $content;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->init();
     }
diff --git a/typo3/sysext/backend/Classes/Controller/File/EditFileController.php b/typo3/sysext/backend/Classes/Controller/File/EditFileController.php
index 27a42c8db158..29ee2f1ec3bc 100644
--- a/typo3/sysext/backend/Classes/Controller/File/EditFileController.php
+++ b/typo3/sysext/backend/Classes/Controller/File/EditFileController.php
@@ -18,9 +18,9 @@ use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Form\FormResultCompiler;
 use TYPO3\CMS\Backend\Form\NodeFactory;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
 use TYPO3\CMS\Backend\Template\DocumentTemplate;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Messaging\FlashMessage;
@@ -34,7 +34,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
 /**
  * Script Class for rendering the file editing screen
  */
-class EditFileController extends AbstractModule
+class EditFileController
 {
     /**
      * Module content accumulated.
@@ -83,12 +83,19 @@ class EditFileController extends AbstractModule
      */
     protected $fileObject;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->init();
     }
diff --git a/typo3/sysext/backend/Classes/Controller/File/FileUploadController.php b/typo3/sysext/backend/Classes/Controller/File/FileUploadController.php
index 03fcbebde0fb..eced801dfd51 100644
--- a/typo3/sysext/backend/Classes/Controller/File/FileUploadController.php
+++ b/typo3/sysext/backend/Classes/Controller/File/FileUploadController.php
@@ -16,7 +16,7 @@ namespace TYPO3\CMS\Backend\Controller\File;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Resource\Exception\InsufficientFolderAccessPermissionsException;
@@ -26,7 +26,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
 /**
  * Script Class for display up to 10 upload fields
  */
-class FileUploadController extends AbstractModule
+class FileUploadController
 {
     /**
      * Name of the filemount
@@ -63,12 +63,19 @@ class FileUploadController extends AbstractModule
      */
     protected $folderObject;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_misc.xlf');
         $this->init();
diff --git a/typo3/sysext/backend/Classes/Controller/File/RenameFileController.php b/typo3/sysext/backend/Classes/Controller/File/RenameFileController.php
index 2f891185a4e1..a3cf17c63073 100644
--- a/typo3/sysext/backend/Classes/Controller/File/RenameFileController.php
+++ b/typo3/sysext/backend/Classes/Controller/File/RenameFileController.php
@@ -16,8 +16,8 @@ namespace TYPO3\CMS\Backend\Controller\File;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Resource\DuplicationBehavior;
@@ -29,7 +29,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
 /**
  * Script Class for the rename-file form.
  */
-class RenameFileController extends AbstractModule
+class RenameFileController
 {
     /**
      * Name of the filemount
@@ -68,12 +68,19 @@ class RenameFileController extends AbstractModule
      */
     public $content;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->init();
     }
diff --git a/typo3/sysext/backend/Classes/Controller/File/ReplaceFileController.php b/typo3/sysext/backend/Classes/Controller/File/ReplaceFileController.php
index 295741f0e27d..a6a1c957dfcc 100644
--- a/typo3/sysext/backend/Classes/Controller/File/ReplaceFileController.php
+++ b/typo3/sysext/backend/Classes/Controller/File/ReplaceFileController.php
@@ -16,7 +16,7 @@ namespace TYPO3\CMS\Backend\Controller\File;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Imaging\Icon;
 use TYPO3\CMS\Core\Localization\LanguageService;
@@ -29,7 +29,7 @@ use TYPO3\CMS\Fluid\View\StandaloneView;
 /**
  * Script Class for the rename-file form
  */
-class ReplaceFileController extends AbstractModule
+class ReplaceFileController
 {
     /**
      * Document template object
@@ -73,12 +73,19 @@ class ReplaceFileController extends AbstractModule
      */
     public $content;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->init();
     }
diff --git a/typo3/sysext/backend/Classes/Controller/NewRecordController.php b/typo3/sysext/backend/Classes/Controller/NewRecordController.php
index dd18ae0ca1ae..f1925e9fa009 100644
--- a/typo3/sysext/backend/Classes/Controller/NewRecordController.php
+++ b/typo3/sysext/backend/Classes/Controller/NewRecordController.php
@@ -16,8 +16,8 @@ namespace TYPO3\CMS\Backend\Controller;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Tree\View\NewRecordPageTreeView;
 use TYPO3\CMS\Backend\Tree\View\PagePositionMap;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
@@ -33,7 +33,7 @@ use TYPO3\CMS\Frontend\Page\PageRepository;
 /**
  * Script class for 'db_new'
  */
-class NewRecordController extends AbstractModule
+class NewRecordController
 {
     /**
      * @var array
@@ -146,12 +146,19 @@ class NewRecordController extends AbstractModule
      */
     public $tRows;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $GLOBALS['SOBE'] = $this;
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_misc.xlf');
         $this->init();
diff --git a/typo3/sysext/backend/Classes/Controller/Wizard/AbstractWizardController.php b/typo3/sysext/backend/Classes/Controller/Wizard/AbstractWizardController.php
index 315c9d1b1640..8f68bb069719 100644
--- a/typo3/sysext/backend/Classes/Controller/Wizard/AbstractWizardController.php
+++ b/typo3/sysext/backend/Classes/Controller/Wizard/AbstractWizardController.php
@@ -14,7 +14,6 @@ namespace TYPO3\CMS\Backend\Controller\Wizard;
  * The TYPO3 project - inspiring people to share!
  */
 
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\DocumentTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
@@ -24,7 +23,7 @@ use TYPO3\CMS\Core\Type\Bitmask\Permission;
 /**
  * Class AbstractWizardController
  */
-class AbstractWizardController extends AbstractModule
+class AbstractWizardController
 {
     /**
      * Checks access for element
diff --git a/typo3/sysext/backend/Classes/Controller/Wizard/AddController.php b/typo3/sysext/backend/Classes/Controller/Wizard/AddController.php
index 0e8a22cf800d..a7f7063d6faf 100644
--- a/typo3/sysext/backend/Classes/Controller/Wizard/AddController.php
+++ b/typo3/sysext/backend/Classes/Controller/Wizard/AddController.php
@@ -85,7 +85,6 @@ class AddController extends AbstractWizardController
      */
     public function __construct()
     {
-        parent::__construct();
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_wizards.xlf');
         $GLOBALS['SOBE'] = $this;
 
diff --git a/typo3/sysext/backend/Classes/Controller/Wizard/EditController.php b/typo3/sysext/backend/Classes/Controller/Wizard/EditController.php
index 6c16d1a19a6e..b9f1e9e7d5f4 100644
--- a/typo3/sysext/backend/Classes/Controller/Wizard/EditController.php
+++ b/typo3/sysext/backend/Classes/Controller/Wizard/EditController.php
@@ -53,7 +53,6 @@ class EditController extends AbstractWizardController
      */
     public function __construct()
     {
-        parent::__construct();
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_wizards.xlf');
         $GLOBALS['SOBE'] = $this;
 
diff --git a/typo3/sysext/backend/Classes/Controller/Wizard/ListController.php b/typo3/sysext/backend/Classes/Controller/Wizard/ListController.php
index f9f994b05107..63a9a561d050 100644
--- a/typo3/sysext/backend/Classes/Controller/Wizard/ListController.php
+++ b/typo3/sysext/backend/Classes/Controller/Wizard/ListController.php
@@ -56,7 +56,6 @@ class ListController extends AbstractWizardController
      */
     public function __construct()
     {
-        parent::__construct();
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_wizards.xlf');
         $GLOBALS['SOBE'] = $this;
         $this->P = GeneralUtility::_GP('P');
diff --git a/typo3/sysext/backend/Classes/Controller/Wizard/TableController.php b/typo3/sysext/backend/Classes/Controller/Wizard/TableController.php
index 9fe0d137918e..5b2296129086 100644
--- a/typo3/sysext/backend/Classes/Controller/Wizard/TableController.php
+++ b/typo3/sysext/backend/Classes/Controller/Wizard/TableController.php
@@ -17,6 +17,7 @@ namespace TYPO3\CMS\Backend\Controller\Wizard;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
 use TYPO3\CMS\Core\DataHandling\DataHandler;
@@ -103,12 +104,19 @@ class TableController extends AbstractWizardController
      */
     protected $iconFactory;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_wizards.xlf');
         $GLOBALS['SOBE'] = $this;
 
diff --git a/typo3/sysext/backend/Classes/Module/AbstractModule.php b/typo3/sysext/backend/Classes/Module/AbstractModule.php
index aeae8ab72db3..e73108b9fedf 100644
--- a/typo3/sysext/backend/Classes/Module/AbstractModule.php
+++ b/typo3/sysext/backend/Classes/Module/AbstractModule.php
@@ -25,6 +25,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
  * template and comes with a simple dispatcher method.
  *
  * @internal Experimental for now
+ * @deprecated
  */
 class AbstractModule
 {
@@ -40,6 +41,11 @@ class AbstractModule
      */
     public function __construct()
     {
+        trigger_error(
+            'Class AbstractModule is deprecated since TYPO3 v9 and will be removed with TYPO3 v10.'
+            . ' Instantiate ModuleTemplate yourself if needed and use routing registered in Routes.php.',
+            E_USER_DEPRECATED
+        );
         $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
     }
 
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-82689-BackendAbstractWizardControllerNotExtendsAbstractModule.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82689-BackendAbstractWizardControllerNotExtendsAbstractModule.rst
new file mode 100644
index 000000000000..0924d1bbd580
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Breaking-82689-BackendAbstractWizardControllerNotExtendsAbstractModule.rst
@@ -0,0 +1,44 @@
+.. include:: ../../Includes.txt
+
+==============================================================================
+Breaking: #82689 - Backend AbstractWizardController not extends AbstractModule
+==============================================================================
+
+See :issue:`82689`
+
+Description
+===========
+
+The PHP class :php:`TYPO3\CMS\Backend\Controller\Wizard\AbstractWizardController` no
+longer extends class :php:`TYPO3\CMS\Backend\Module\AbstractModule`. This can be breaking
+if wizard classes of extensions depend on method :php:`processRequest()` or the initialized
+property :php:`moduleTemplate`.
+
+PHP class :php:`TYPO3\CMS\Backend\Module\AbstractModule` has been deprecated and should not be used any longer.
+
+
+Impact
+======
+
+* Using class :php:`AbstractModule` will throw a deprecation warning
+* Extensions with wizards extending class :php:`AbstractWizardController`
+  may fatal if they use property :php:`moduleTemplate`
+* Extensions with wizards extending class :php:`AbstractWizardController`
+  may fatal if they use they registered routes to method :php:`processRequest`
+
+
+Affected Installations
+======================
+
+Installations with extensions with one of the above described patterns.
+
+
+Migration
+=========
+
+Extensions that extend :php:`AbstractModule` should initialize :php:`moduleTemplate`
+at an appropriate place instead. Instead of :php:`processRequest()`, routes should be
+registered in an extensions :file:`Configuration/Backend/Routes.php` and
+:file:`Configuration/Backend/AjaxRoutes.php`.
+
+.. index:: Backend, PHP-API, PartiallyScanned
\ No newline at end of file
diff --git a/typo3/sysext/install/Configuration/ExtensionScanner/Php/ClassNameMatcher.php b/typo3/sysext/install/Configuration/ExtensionScanner/Php/ClassNameMatcher.php
index 3f2af70a4755..63b7b6937cf4 100644
--- a/typo3/sysext/install/Configuration/ExtensionScanner/Php/ClassNameMatcher.php
+++ b/typo3/sysext/install/Configuration/ExtensionScanner/Php/ClassNameMatcher.php
@@ -384,6 +384,11 @@ return [
             'Breaking-82406-RoutingBackendModulesRunThroughRegularDispatcher.rst',
         ],
     ],
+    'TYPO3\CMS\Backend\Module\AbstractModule' => [
+        'restFiles' => [
+            'Breaking-82689-BackendAbstractWizardControllerNotExtendsAbstractModule.rst',
+        ],
+    ],
 
     // Removed interfaces
     'TYPO3\CMS\Backend\Form\DatabaseFileIconsHookInterface' => [
diff --git a/typo3/sysext/linkvalidator/Classes/Report/LinkValidatorReport.php b/typo3/sysext/linkvalidator/Classes/Report/LinkValidatorReport.php
index 3e184c9b9a3d..9a31f6be07ec 100644
--- a/typo3/sysext/linkvalidator/Classes/Report/LinkValidatorReport.php
+++ b/typo3/sysext/linkvalidator/Classes/Report/LinkValidatorReport.php
@@ -226,8 +226,6 @@ class LinkValidatorReport extends \TYPO3\CMS\Backend\Module\AbstractFunctionModu
             ];
         }
 
-        // @todo: Use $this-moduleTemplate as soon as this class extends from AbstractModule
-        /** @var ModuleTemplate $moduleTemplate */
         $moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         return $moduleTemplate->getDynamicTabMenu($menuItems, 'report-linkvalidator');
     }
diff --git a/typo3/sysext/recordlist/Classes/RecordList.php b/typo3/sysext/recordlist/Classes/RecordList.php
index 01f011c3d3d2..f9f4b1f72abe 100644
--- a/typo3/sysext/recordlist/Classes/RecordList.php
+++ b/typo3/sysext/recordlist/Classes/RecordList.php
@@ -17,7 +17,6 @@ namespace TYPO3\CMS\Recordlist;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Clipboard\Clipboard;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Template\Components\ButtonBar;
 use TYPO3\CMS\Backend\Template\DocumentTemplate;
 use TYPO3\CMS\Backend\Template\ModuleTemplate;
@@ -37,7 +36,7 @@ use TYPO3\CMS\Core\Utility\GeneralUtility;
 /**
  * Script Class for the Web > List module; rendering the listing of records on a page
  */
-class RecordList extends AbstractModule
+class RecordList
 {
     /**
      * Page Id for which to make the listing
@@ -187,12 +186,19 @@ class RecordList extends AbstractModule
      */
     protected $iconFactory;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Constructor
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_mod_web_list.xlf');
         $this->moduleTemplate->getPageRenderer()->loadJquery();
         $this->moduleTemplate->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Recordlist/FieldSelectBox');
diff --git a/typo3/sysext/setup/Classes/Controller/SetupModuleController.php b/typo3/sysext/setup/Classes/Controller/SetupModuleController.php
index d4a710a71bd8..a7904ef0b422 100644
--- a/typo3/sysext/setup/Classes/Controller/SetupModuleController.php
+++ b/typo3/sysext/setup/Classes/Controller/SetupModuleController.php
@@ -17,8 +17,8 @@ namespace TYPO3\CMS\Setup\Controller;
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Backend\Avatar\DefaultAvatarProvider;
-use TYPO3\CMS\Backend\Module\AbstractModule;
 use TYPO3\CMS\Backend\Module\ModuleLoader;
+use TYPO3\CMS\Backend\Template\ModuleTemplate;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
 use TYPO3\CMS\Core\Authentication\BackendUserAuthentication;
 use TYPO3\CMS\Core\Database\ConnectionPool;
@@ -36,7 +36,7 @@ use TYPO3\CMS\Saltedpasswords\Salt\SaltFactory;
 /**
  * Script class for the Setup module
  */
-class SetupModuleController extends AbstractModule
+class SetupModuleController
 {
     /**
      * Flag if password has not been updated
@@ -165,12 +165,19 @@ class SetupModuleController extends AbstractModule
      */
     protected $beUser;
 
+    /**
+     * ModuleTemplate object
+     *
+     * @var ModuleTemplate
+     */
+    protected $moduleTemplate;
+
     /**
      * Instantiate the form protection before a simulated user is initialized.
      */
     public function __construct()
     {
-        parent::__construct();
+        $this->moduleTemplate = GeneralUtility::makeInstance(ModuleTemplate::class);
         $this->formProtection = FormProtectionFactory::get();
         $pageRenderer = $this->moduleTemplate->getPageRenderer();
         $pageRenderer->loadRequireJsModule('TYPO3/CMS/Backend/Modal');
-- 
GitLab