[TASK] Use ServerRequestInterface in Wizard/AddController 00/56200/12
authorŁukasz Uznański <l.uznanski@macopedia.pl>
Thu, 15 Mar 2018 21:51:17 +0000 (22:51 +0100)
committerFrank Naegler <frank.naegler@typo3.org>
Fri, 16 Mar 2018 13:35:44 +0000 (14:35 +0100)
Replace _GP, getIndpEnv, public methods, public properties

Resolves: #84321
Releases: master
Change-Id: I911927568b8ea86b4edb2bef5a25e84c625e27ef
Reviewed-on: https://review.typo3.org/56200
Reviewed-by: Mathias Brodala <mbrodala@pagemachine.de>
Tested-by: Mathias Brodala <mbrodala@pagemachine.de>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Frank Naegler <frank.naegler@typo3.org>
Tested-by: Frank Naegler <frank.naegler@typo3.org>
typo3/sysext/backend/Classes/Controller/Wizard/AddController.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-84321-ProtectedMethodsAndPropertiesInAddController.rst [new file with mode: 0644]
typo3/sysext/install/Configuration/ExtensionScanner/Php/PropertyProtectedMatcher.php

index f069a3e..812dd83 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types = 1);
 namespace TYPO3\CMS\Backend\Controller\Wizard;
 
 /*
@@ -19,6 +20,7 @@ use Psr\Http\Message\ServerRequestInterface;
 use TYPO3\CMS\Backend\Form\FormDataCompiler;
 use TYPO3\CMS\Backend\Form\FormDataGroup\TcaDatabaseRecord;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Compatibility\PublicPropertyDeprecationTrait;
 use TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools;
 use TYPO3\CMS\Core\DataHandling\DataHandler;
 use TYPO3\CMS\Core\Http\HtmlResponse;
@@ -32,54 +34,71 @@ use TYPO3\CMS\Core\Utility\MathUtility;
  */
 class AddController extends AbstractWizardController
 {
+    use PublicPropertyDeprecationTrait;
+
+    /**
+     * Properties which have been moved to protected status from public
+     *
+     * @var array
+     */
+    protected $deprecatedPublicProperties = [
+        'content' => 'Using $content of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+        'processDataFlag' => 'Using $processDataFlag of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+        'pid' => 'Using $pid of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+        'table' => 'Using $table of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+        'id' => 'Using $id of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+        'P' => 'Using $P of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+        'returnEditConf' => 'Using $returnEditConf of class AddController from the outside is discouraged, as this variable is only used for internal storage.',
+    ];
     /**
      * Content accumulation for the module.
      *
      * @var string
+     * @deprecated since v9, will be removed in v10, unused
      */
-    public $content;
+    protected $content;
 
     /**
      * If set, the DataHandler class is loaded and used to add the returning ID to the parent record.
      *
      * @var int
      */
-    public $processDataFlag = 0;
+    protected $processDataFlag = 0;
 
     /**
      * Create new record -pid (pos/neg). If blank, return immediately
      *
      * @var int
      */
-    public $pid;
+    protected $pid;
 
     /**
      * The parent table we are working on.
      *
      * @var string
      */
-    public $table;
+    protected $table;
 
     /**
      * Loaded with the created id of a record FormEngine returns ...
      *
      * @var int
      */
-    public $id;
+    protected $id;
 
     /**
      * Wizard parameters, coming from TCEforms linking to the wizard.
      *
      * @var array
      */
-    public $P;
+    protected $P;
 
     /**
      * Information coming back from the FormEngine script, telling what the table/id was of the newly created record.
      *
-     * @var array
+     * @var string
      */
-    public $returnEditConf;
+    protected $returnEditConf;
 
     /**
      * Constructor
@@ -87,19 +106,46 @@ class AddController extends AbstractWizardController
     public function __construct()
     {
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_wizards.xlf');
-        $GLOBALS['SOBE'] = $this;
+        // @deprecated since v9, will be moved out of __construct() in v10
+        $this->init($GLOBALS['TYPO3_REQUEST']);
+    }
 
-        $this->init();
+    /**
+     * Injects the request object for the current request or subrequest
+     * As this controller goes only through the main() method, it is rather simple for now
+     *
+     * @param ServerRequestInterface $request
+     * @return ResponseInterface
+     */
+    public function mainAction(ServerRequestInterface $request): ResponseInterface
+    {
+        $this->processRequest();
+        return new HtmlResponse('');
+    }
+
+    /**
+     * Main function
+     * Will issue a location-header, redirecting either BACK or to a new FormEngine instance...
+     *
+     * @deprecated since v9, will be removed in v10
+     */
+    public function main()
+    {
+        trigger_error('Method main() will be replaced by protected method processRequest() in v10. Do not call from other extension', E_USER_DEPRECATED);
+        $this->processRequest();
     }
 
     /**
      * Initialization of the class.
+     * @param ServerRequestInterface $request
      */
-    protected function init()
+    protected function init(ServerRequestInterface $request): void
     {
+        $parsedBody = $request->getParsedBody();
+        $queryParams = $request->getQueryParams();
         // Init GPvars:
-        $this->P = GeneralUtility::_GP('P');
-        $this->returnEditConf = GeneralUtility::_GP('returnEditConf');
+        $this->P = $parsedBody['P'] ?? $queryParams['P'] ?? [];
+        $this->returnEditConf = $parsedBody['returnEditConf'] ?? $queryParams['returnEditConf'] ?? null;
         // Get this record
         $record = BackendUtility::getRecord($this->P['table'], $this->P['uid']);
         // Set table:
@@ -152,23 +198,10 @@ class AddController extends AbstractWizardController
     }
 
     /**
-     * Injects the request object for the current request or subrequest
-     * As this controller goes only through the main() method, it is rather simple for now
-     *
-     * @param ServerRequestInterface $request
-     * @return ResponseInterface
-     */
-    public function mainAction(ServerRequestInterface $request): ResponseInterface
-    {
-        $this->main();
-        return new HtmlResponse('');
-    }
-
-    /**
      * Main function
      * Will issue a location-header, redirecting either BACK or to a new FormEngine instance...
      */
-    public function main()
+    protected function processRequest(): void
     {
         if ($this->returnEditConf) {
             if ($this->processDataFlag) {
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-84321-ProtectedMethodsAndPropertiesInAddController.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-84321-ProtectedMethodsAndPropertiesInAddController.rst
new file mode 100644 (file)
index 0000000..1a0d1cb
--- /dev/null
@@ -0,0 +1,58 @@
+.. include:: ../../Includes.txt
+
+================================================================================
+Deprecation: #84321 - Protected methods and properties in AddController
+================================================================================
+
+See :issue:`84321`
+
+Description
+===========
+
+This file is about third party usage (consumer that call the class as well as
+signals or hooks depending on it) of :php:`TYPO3\CMS\Backend\Controller\Wizard\AddController`.
+
+A series of class properties has been set to protected.
+They will throw deprecation warnings if called public from outside:
+
+* [not scanned] :php:`$content`
+* :php:`$processDataFlag`
+* [not scanned] :php:`$pid`
+* [not scanned] :php:`$table`
+* [not scanned] :php:`$id`
+* :php:`$P`
+* :php:`$returnEditConf`
+
+All methods not used as entry points by :php:`TYPO3\CMS\Backend\Http\RouteDispatcher` will be
+removed or set to protected in v10 and throw deprecation warnings if used from a third party:
+
+* [not scanned] :php:`init()`
+* [not scanned] :php:`main()`
+
+Additionally :php:`$GLOBALS['SOBE']` is not set by the :php:`AddController` constructor anymore.
+
+
+Impact
+======
+
+Calling one of the above methods or accessing one of the above properties on an instance of
+:php:`AddController` will throw a deprecation warning in v9 and a PHP fatal in v10.
+
+
+Affected Installations
+======================
+
+The extension scanner will find most usages, but may also find some false positives. The most
+common property and method names like :php:`$content` are not registered and will not be found
+if an extension uses that on an instance of :php:`AddController`. In general all extensions
+that set properties or call methods except :php:`mainAction()` are affected.
+
+
+Migration
+=========
+
+In general, extensions should not instantiate and re-use controllers of the core. Existing
+usages should be rewritten to be free of calls like these.
+
+
+.. index:: Backend, PHP-API, PartiallyScanned
index 94d7955..70a38dc 100644 (file)
@@ -382,4 +382,19 @@ return [
             'Deprecation-84334-ProtectedMethodsAndPropertiesInReplaceFileController.rst',
         ],
     ],
+    'TYPO3\CMS\Backend\Controller\Wizard\AddController->processDataFlag' => [
+        'restFiles' => [
+            'Deprecation-84321-ProtectedMethodsAndPropertiesInAddController.rst',
+        ],
+    ],
+    'TYPO3\CMS\Backend\Controller\Wizard\AddController->P' => [
+        'restFiles' => [
+            'Deprecation-84321-ProtectedMethodsAndPropertiesInAddController.rst',
+        ],
+    ],
+    'TYPO3\CMS\Backend\Controller\Wizard\AddController->returnEditConf' => [
+        'restFiles' => [
+            'Deprecation-84321-ProtectedMethodsAndPropertiesInAddController.rst',
+        ],
+    ],
 ];