[TASK] Use ServerRequestInterface in Wizard/ListController 16/56216/4
authorŁukasz Uznański <l.uznanski@macopedia.pl>
Fri, 16 Mar 2018 11:38:31 +0000 (12:38 +0100)
committerFrank Naegler <frank.naegler@typo3.org>
Fri, 16 Mar 2018 14:05:59 +0000 (15:05 +0100)
* deprecate public properties
* deprecate public (non-routed) methods
* replace usages of _GP, getIndpEnv

Resolves: #84337
Releases: master
Change-Id: I6f6e139cf4dc4b6d9281c99c436562b435ebfe5b
Reviewed-on: https://review.typo3.org/56216
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Tested-by: Anja Leichsenring <aleichsenring@ab-softlab.de>
Reviewed-by: Frank Naegler <frank.naegler@typo3.org>
Tested-by: Frank Naegler <frank.naegler@typo3.org>
typo3/sysext/backend/Classes/Controller/Wizard/ListController.php
typo3/sysext/core/Documentation/Changelog/master/Deprecation-84337-ProtectedMethodsAndPropertiesInListController.rst [new file with mode: 0644]

index 344724c..1f904bb 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+declare(strict_types = 1);
 namespace TYPO3\CMS\Backend\Controller\Wizard;
 
 /*
@@ -16,7 +17,9 @@ namespace TYPO3\CMS\Backend\Controller\Wizard;
 
 use Psr\Http\Message\ResponseInterface;
 use Psr\Http\Message\ServerRequestInterface;
+use TYPO3\CMS\Backend\Routing\UriBuilder;
 use TYPO3\CMS\Backend\Utility\BackendUtility;
+use TYPO3\CMS\Core\Compatibility\PublicPropertyDeprecationTrait;
 use TYPO3\CMS\Core\Http\HtmlResponse;
 use TYPO3\CMS\Core\Utility\GeneralUtility;
 use TYPO3\CMS\Core\Utility\HttpUtility;
@@ -26,31 +29,44 @@ use TYPO3\CMS\Core\Utility\HttpUtility;
  */
 class ListController extends AbstractWizardController
 {
+    use PublicPropertyDeprecationTrait;
+
+    /**
+     * Properties which have been moved to protected status from public
+     *
+     * @var array
+     */
+    protected $deprecatedPublicProperties = [
+        'pid' => 'Using $pid of class ListController from the outside is discouraged, as this variable is only used for internal storage.',
+        'P' => 'Using $P of class ListController from the outside is discouraged, as this variable is only used for internal storage.',
+        'table' => 'Using $table of class ListController from the outside is discouraged, as this variable is only used for internal storage.',
+        'id' => 'Using $id of class ListController from the outside is discouraged, as this variable is only used for internal storage.',
+    ];
     /**
      * @var int
      */
-    public $pid;
+    protected $pid;
 
     /**
      * Wizard parameters, coming from FormEngine linking to the wizard.
      *
      * @var array
      */
-    public $P;
+    protected $P;
 
     /**
      * Table to show, if none, then all tables are listed in list module.
      *
      * @var string
      */
-    public $table;
+    protected $table;
 
     /**
      * Page id to list.
      *
      * @var string
      */
-    public $id;
+    protected $id;
 
     /**
      * Initialization of the class, setting GPvars.
@@ -59,9 +75,15 @@ class ListController extends AbstractWizardController
     {
         $this->getLanguageService()->includeLLFile('EXT:lang/Resources/Private/Language/locallang_wizards.xlf');
         $GLOBALS['SOBE'] = $this;
-        $this->P = GeneralUtility::_GP('P');
-        $this->table = GeneralUtility::_GP('table');
-        $this->id = GeneralUtility::_GP('id');
+
+        // @deprecated since v9, will be obsolete in v10
+        $request = $GLOBALS['TYPO3_REQUEST'];
+        $parsedBody = $request->getParsedBody();
+        $queryParams = $request->getQueryParams();
+
+        $this->P = $parsedBody['P'] ?? $queryParams['P'] ?? null;
+        $this->table = $parsedBody['table'] ?? $queryParams['table'] ?? null;
+        $this->id = $parsedBody['id'] ?? $queryParams['id'] ?? null;
     }
 
     /**
@@ -73,15 +95,26 @@ class ListController extends AbstractWizardController
      */
     public function mainAction(ServerRequestInterface $request): ResponseInterface
     {
-        $this->main();
+        $this->processRequest($request);
         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(): void
+    {
+        trigger_error('Method main() will be replaced by protected method processRequest() in v10. Do not call from other extension', E_USER_DEPRECATED);
+        $this->processRequest($GLOBALS['TYPO3_REQUEST']);
+    }
+    /**
+     * Main function
+     * Will issue a location-header, redirecting either BACK or to a new FormEngine instance...
+     * @param ServerRequestInterface $request
      */
-    public function main()
+    protected function processRequest(ServerRequestInterface $request): void
     {
         // Get this record
         $origRow = BackendUtility::getRecord($this->P['table'], $this->P['uid']);
@@ -106,15 +139,17 @@ class ListController extends AbstractWizardController
         if ((string)$this->id !== '') {
             $redirectUrl = GeneralUtility::sanitizeLocalUrl($this->P['returnUrl']);
         } else {
-            /** @var \TYPO3\CMS\Backend\Routing\UriBuilder $uriBuilder */
-            $uriBuilder = GeneralUtility::makeInstance(\TYPO3\CMS\Backend\Routing\UriBuilder::class);
+            /** @var UriBuilder $uriBuilder */
+            $uriBuilder = GeneralUtility::makeInstance(UriBuilder::class);
+            $normalizedParams = $request->getAttribute('normalizedParams');
+            $requestUri = $normalizedParams->getRequestUri();
             // Otherwise, show the list:
             $urlParameters = [];
             $urlParameters['id'] = $this->pid;
             $urlParameters['table'] = $this->P['params']['table'];
             $urlParameters['returnUrl'] = !empty($this->P['returnUrl'])
                 ? GeneralUtility::sanitizeLocalUrl($this->P['returnUrl'])
-                : GeneralUtility::getIndpEnv('REQUEST_URI');
+                : $requestUri;
             $redirectUrl = (string)$uriBuilder->buildUriFromRoute('web_list', $urlParameters);
         }
         HttpUtility::redirect($redirectUrl);
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-84337-ProtectedMethodsAndPropertiesInListController.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-84337-ProtectedMethodsAndPropertiesInListController.rst
new file mode 100644 (file)
index 0000000..5ce45a2
--- /dev/null
@@ -0,0 +1,50 @@
+.. include:: ../../Includes.txt
+
+================================================================================
+Deprecation: #84337 - Protected methods and properties in ListController
+================================================================================
+
+See :issue:`84337`
+
+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\ListController`.
+
+A series of class properties has been set to protected.
+They will throw deprecation warnings if called public from outside:
+
+* [not scanned] :php:`pid`
+* [not scanned] :php:`P`
+* [not scanned] :php:`table`
+* [not scanned] :php:`id`
+
+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:`main()`
+
+
+Impact
+======
+
+Calling above method on an instance of
+:php:`ListController` will throw a deprecation warning in v9 and a PHP fatal in v10.
+
+
+Affected Installations
+======================
+
+The extension scanner will find all usages, but may also find some false positives.  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
\ No newline at end of file