[!!!][TASK] Remove entryPointPath from main applications 78/47378/8
authorBenni Mack <benni@typo3.org>
Tue, 29 Mar 2016 13:27:45 +0000 (15:27 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Thu, 31 Mar 2016 21:01:55 +0000 (23:01 +0200)
The entry point path is only used to calculate the number
of levels nested under the PATH_site so the PATH_site
constant can be calculated.

In order to be more flexible with paths, the hard-coded name
"typo3/" is removed and the calculation is based on the
number of subdirectories instead of naming the directories
which are irrelevant.

Resolves: #75323
Releases: master
Change-Id: Ibbad9ed803aaf588d540d19e0c7cd1bdce88d473
Reviewed-on: https://review.typo3.org/47378
Reviewed-by: Susanne Moog <typo3@susannemoog.de>
Tested-by: Susanne Moog <typo3@susannemoog.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
typo3/sysext/backend/Classes/Console/Application.php
typo3/sysext/backend/Classes/Http/Application.php
typo3/sysext/core/Classes/Console/CommandApplication.php
typo3/sysext/core/Classes/Core/Bootstrap.php
typo3/sysext/core/Classes/Core/SystemEnvironmentBuilder.php
typo3/sysext/core/Documentation/Changelog/master/Breaking-75323-RemovedParameterEntryPointPathFromMainApplications.rst [new file with mode: 0644]
typo3/sysext/core/Tests/Testbase.php
typo3/sysext/core/Tests/Unit/Core/SystemEnvironmentBuilderTest.php
typo3/sysext/frontend/Classes/Http/Application.php
typo3/sysext/install/Classes/Http/Application.php

index 8feb4b9..d1bd7dc 100644 (file)
@@ -27,10 +27,10 @@ class Application implements ApplicationInterface
     protected $bootstrap;
 
     /**
-     *
-     * @var string
+     * Number of subdirectories where the entry script is located, relative to PATH_site
+     * @var int
      */
-    protected $entryPointPath = 'typo3/';
+    protected $entryPointLevel = 1;
 
     /**
      * All available request handlers that can deal with a CLI Request
@@ -54,7 +54,7 @@ class Application implements ApplicationInterface
         $this->bootstrap = Bootstrap::getInstance()
             ->initializeClassLoader($classLoader)
             ->setRequestType(TYPO3_REQUESTTYPE_BE | TYPO3_REQUESTTYPE_CLI)
-            ->baseSetup($this->entryPointPath);
+            ->baseSetup($this->entryPointLevel);
 
         foreach ($this->availableRequestHandlers as $requestHandler) {
             $this->bootstrap->registerRequestHandlerImplementation($requestHandler);
index ebbe17a..218da63 100644 (file)
@@ -27,9 +27,11 @@ class Application implements ApplicationInterface
     protected $bootstrap;
 
     /**
-     * @var string
+     * Number of subdirectories where the entry script is located, relative to PATH_site
+     * Usually this is equal to PATH_site = 0
+     * @var int
      */
-    protected $entryPointPath = 'typo3/';
+    protected $entryPointLevel = 1;
 
     /**
      * @var \Psr\Http\Message\ServerRequestInterface
@@ -58,11 +60,11 @@ class Application implements ApplicationInterface
         $this->bootstrap = Bootstrap::getInstance()
             ->initializeClassLoader($classLoader)
             ->setRequestType(TYPO3_REQUESTTYPE_BE | (!empty($_GET['ajaxID']) ? TYPO3_REQUESTTYPE_AJAX : 0))
-            ->baseSetup($this->entryPointPath);
+            ->baseSetup($this->entryPointLevel);
 
         // Redirect to install tool if base configuration is not found
         if (!$this->bootstrap->checkIfEssentialConfigurationExists()) {
-            $this->bootstrap->redirectToInstallTool($this->entryPointPath);
+            $this->bootstrap->redirectToInstallTool($this->entryPointLevel);
         }
 
         foreach ($this->availableRequestHandlers as $requestHandler) {
index a7ba5eb..c813786 100644 (file)
@@ -30,9 +30,10 @@ class CommandApplication implements ApplicationInterface
     protected $bootstrap;
 
     /**
-     * @var string
+     * Number of subdirectories where the entry script is located, relative to PATH_site
+     * @var int
      */
-    protected $entryPointPath = 'typo3/sysext/core/bin/';
+    protected $entryPointLevel = 4;
 
     /**
      * All available request handlers that can deal with a CLI Request
@@ -55,7 +56,7 @@ class CommandApplication implements ApplicationInterface
         $this->bootstrap = Bootstrap::getInstance()
             ->initializeClassLoader($classLoader)
             ->setRequestType(TYPO3_REQUESTTYPE_BE | TYPO3_REQUESTTYPE_CLI)
-            ->baseSetup($this->entryPointPath);
+            ->baseSetup($this->entryPointLevel);
 
         foreach ($this->availableRequestHandlers as $requestHandler) {
             $this->bootstrap->registerRequestHandlerImplementation($requestHandler);
index a14fb60..70514f9 100644 (file)
@@ -184,17 +184,17 @@ class Bootstrap
      *
      * Script execution will be aborted if something fails here.
      *
-     * @param string $relativePathPart Relative path of entry script back to document root
+     * @param int $entryPointLevel Number of subdirectories where the entry script is located under the document root
      * @return Bootstrap
      * @throws \RuntimeException when TYPO3_REQUESTTYPE was not set before, setRequestType() needs to be called before
      * @internal This is not a public API method, do not use in own extensions
      */
-    public function baseSetup($relativePathPart = '')
+    public function baseSetup($entryPointLevel = 0)
     {
         if (!defined('TYPO3_REQUESTTYPE')) {
             throw new \RuntimeException('No Request Type was set, TYPO3 does not know in which context it is run.', 1450561838);
         }
-        SystemEnvironmentBuilder::run($relativePathPart);
+        SystemEnvironmentBuilder::run($entryPointLevel);
         if (!self::$usesComposerClassLoading && ClassLoadingInformation::isClassLoadingInformationAvailable()) {
             ClassLoadingInformation::registerClassLoadingInformation();
         }
@@ -235,12 +235,16 @@ class Bootstrap
     /**
      * Redirect to install tool if LocalConfiguration.php is missing.
      *
+     * @param int $entryPointLevel Number of subdirectories where the entry script is located under the document root
      * @internal This is not a public API method, do not use in own extensions
      */
-    public function redirectToInstallTool($relativePathPart = '')
+    public function redirectToInstallTool($entryPointLevel = 0)
     {
-        $backPathToSiteRoot = str_repeat('../', count(explode('/', $relativePathPart)) - 1);
-        header('Location: ' . $backPathToSiteRoot . 'typo3/sysext/install/Start/Install.php');
+        $path = TYPO3_mainDir . 'sysext/install/Start/Install.php';
+        if ($entryPointLevel > 0) {
+            $path = str_repeat('../', $entryPointLevel) . $path;
+        }
+        header('Location: ' . $path);
         die;
     }
 
index cc3d32c..0091744 100644 (file)
@@ -64,13 +64,13 @@ class SystemEnvironmentBuilder
      * This entry method is used in all scopes (FE, BE, eid, ajax, ...)
      *
      * @internal This method should not be used by 3rd party code. It will change without further notice.
-     * @param string $relativePathPart Relative path of the entry script back to document root
+     * @param int $entryPointLevel Number of subdirectories where the entry script is located under the document root
      * @return void
      */
-    public static function run($relativePathPart = '')
+    public static function run($entryPointLevel = 0)
     {
         self::defineBaseConstants();
-        self::definePaths($relativePathPart);
+        self::definePaths($entryPointLevel);
         self::checkMainPathsExist();
         self::initializeGlobalVariables();
         self::initializeGlobalTimeTrackingVariables();
@@ -146,10 +146,10 @@ class SystemEnvironmentBuilder
     /**
      * Calculate all required base paths and set as constants.
      *
-     * @param string $relativePathPart Relative path of the entry script back to document root
+     * @param int $entryPointLevel Number of subdirectories where the entry script is located under the document root
      * @return void
      */
-    protected static function definePaths($relativePathPart = '')
+    protected static function definePaths($entryPointLevel = 0)
     {
         // Relative path from document root to typo3/ directory
         // Hardcoded to "typo3/"
@@ -164,7 +164,7 @@ class SystemEnvironmentBuilder
         // Absolute path of the document root of the instance with trailing slash
         // Example "/var/www/instance-name/htdocs/"
         if (!defined('PATH_site')) {
-            define('PATH_site', self::getPathSite($relativePathPart));
+            define('PATH_site', self::getPathSite($entryPointLevel));
         }
         // Absolute path of the typo3 directory of the instance with trailing slash
         // Example "/var/www/instance-name/htdocs/typo3/"
@@ -356,43 +356,43 @@ class SystemEnvironmentBuilder
     }
 
     /**
-     * Calculate the document root part to the instance from PATH_thisScript
+     * Calculate the document root part to the instance from PATH_thisScript.
+     * This is based on the amount of subdirectories "under" PATH_site where PATH_thisScript is located.
      *
-     * We have two main scenarios for entry points:
-     * - Directly called documentRoot/index.php (-> FE call or eiD include): index.php sets $relativePathPart to
-     * empty string to hint this code that the document root is identical to the directory the script is located at.
-     * - An indirect include of any Backend related script (-> typo3/index.php or the install tool).
-     * - A Backend script: This is the case for the index.php dispatcher and other entry scripts like 'cli_dispatch.phpsh'
-     * or 'typo3/index.php' that are located inside typo3/ directly. In this case the Bootstrap->run() command sets
-     * 'typo3/' as $relativePathPart as base to calculate the document root.
+     * The following main scenarios for entry points exist by default in the TYPO3 core:
+     * - Directly called documentRoot/index.php (-> FE call or eiD include): index.php is located in the same directory
+     * as the main project. The document root is identical to the directory the script is located at.
+     * - The install tool, located under typo3/sysext/install/Start/Install.php.
+     * - A Backend script: This is the case for the typo3/index.php dispatcher and other entry scripts like 'cli_dispatch.phpsh'
+     * or 'typo3/index.php' that are located inside typo3/ directly.
      *
-     * @param string $relativePathPart Relative directory part from document root to script path
+     * @param int $entryPointLevel Number of subdirectories where the entry script is located under the document root
      * @return string Absolute path to document root of installation
      */
-    protected static function getPathSite($relativePathPart)
+    protected static function getPathSite($entryPointLevel)
     {
-        $entryScriptDirectory = self::getUnifiedDirectoryNameWithTrailingSlash(PATH_thisScript);
-        if ($relativePathPart !== '') {
-            $pathSite = substr($entryScriptDirectory, 0, -strlen($relativePathPart));
+        $entryScriptDirectory = self::getUnifiedDirectoryName(PATH_thisScript);
+        if ($entryPointLevel > 0) {
+            list($pathSite) = GeneralUtility::revExplode('/', $entryScriptDirectory, $entryPointLevel+1);
         } else {
             $pathSite = $entryScriptDirectory;
         }
-        return $pathSite;
+        return $pathSite . '/';
     }
 
     /**
      * Remove file name from script path and unify for Windows and Unix
      *
      * @param string $absolutePath Absolute path to script
-     * @return string Directory name of script file location, unified for Windows and Unix
+     * @return string Directory name of script file location, unified for Windows and Unix without the trailing slash
      */
-    protected static function getUnifiedDirectoryNameWithTrailingSlash($absolutePath)
+    protected static function getUnifiedDirectoryName($absolutePath)
     {
         $directory = dirname($absolutePath);
         if (TYPO3_OS === 'WIN') {
             $directory = str_replace('\\', '/', $directory);
         }
-        return $directory . '/';
+        return $directory;
     }
 
     /**
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Breaking-75323-RemovedParameterEntryPointPathFromMainApplications.rst b/typo3/sysext/core/Documentation/Changelog/master/Breaking-75323-RemovedParameterEntryPointPathFromMainApplications.rst
new file mode 100644 (file)
index 0000000..1978c98
--- /dev/null
@@ -0,0 +1,33 @@
+==========================================================================
+Breaking: #75323 - Removed parameter entryPointPath from main applications
+==========================================================================
+
+Description
+===========
+
+The entry point ``PHP`` classes for ``index.php``, ``typo3/index.php`` and so for forth (called "Application classes")
+now have a parameter not to define the path to the entry point but the number of subdirectories under the main
+installation path, allowing to not specify the name of the path, but just the levels of subdirectories.
+
+Subsequently, the methods ``Bootstrap->baseSetup()``, ``Bootstrap->redirectToInstallTool()`` and
+``SystemEnvironmentBuilder::run()`` now expect an integer as parameter, instead of the path to the entry point script.
+
+
+Impact
+======
+
+Calling one of the methods above with a string as parameter instead of an integer the calculation for PATH_site
+which is the base for the whole installation will fail.
+
+
+Affected Installations
+======================
+
+Any installation with custom entry points or custom extensions with separate entry points.
+
+
+Migration
+=========
+
+Use the entry point level as integer, instead of the string, in your custom entry points. See
+``TYPO3\CMS\Backend\Http\Application`` for an example.
index d0bafa3..8d15484 100644 (file)
@@ -538,7 +538,7 @@ class Testbase
         Bootstrap::getInstance()
             ->initializeClassLoader($classLoader)
             ->setRequestType(TYPO3_REQUESTTYPE_BE | TYPO3_REQUESTTYPE_CLI)
-            ->baseSetup('')
+            ->baseSetup()
             ->loadConfigurationAndInitialize(true)
             ->loadTypo3LoadedExtAndExtLocalconf(true)
             ->setFinalCachingFrameworkCacheConfiguration()
index 4b08355..93bc5fe 100644 (file)
@@ -113,14 +113,14 @@ class SystemEnvironmentBuilderTest extends \TYPO3\CMS\Core\Tests\UnitTestCase
     /**
      * @test
      */
-    public function getUnifiedDirectoryNameWithTrailingSlashReturnsCorrectPathOnUnix()
+    public function getUnifiedDirectoryNameReturnsCorrectPathOnUnix()
     {
         if (TYPO3_OS === 'WIN') {
             $this->markTestSkipped('Test not available on Windows OS.');
         }
         $input = '/foo/bar/test.php';
-        $expected = '/foo/bar/';
-        $actual = $this->subject->_call('getUnifiedDirectoryNameWithTrailingSlash', $input);
+        $expected = '/foo/bar';
+        $actual = $this->subject->_call('getUnifiedDirectoryName', $input);
         $this->assertEquals($expected, $actual);
     }
 
index 1e2eb9f..4d680c7 100644 (file)
@@ -28,10 +28,11 @@ class Application implements ApplicationInterface
     protected $bootstrap;
 
     /**
-     * Usually this is equal to PATH_site = kept empty
-     * @var string
+     * Number of subdirectories where the entry script is located, relative to PATH_site
+     * Usually this is equal to PATH_site = 0
+     * @var int
      */
-    protected $entryPointPath = '';
+    protected $entryPointLevel = 0;
 
     /**
      * All available request handlers that can deal with a Frontend Request
@@ -54,11 +55,11 @@ class Application implements ApplicationInterface
         $this->bootstrap = Bootstrap::getInstance()
             ->initializeClassLoader($classLoader)
             ->setRequestType(TYPO3_REQUESTTYPE_FE)
-            ->baseSetup($this->entryPointPath);
+            ->baseSetup($this->entryPointLevel);
 
         // Redirect to install tool if base configuration is not found
         if (!$this->bootstrap->checkIfEssentialConfigurationExists()) {
-            $this->bootstrap->redirectToInstallTool($this->entryPointPath);
+            $this->bootstrap->redirectToInstallTool($this->entryPointLevel);
         }
 
         foreach ($this->availableRequestHandlers as $requestHandler) {
index a2c058e..00e7631 100644 (file)
@@ -27,9 +27,10 @@ class Application implements ApplicationInterface
     protected $bootstrap;
 
     /**
-     * @var string
+     * Number of subdirectories where the entry script is located, relative to PATH_site
+     * @var int
      */
-    protected $entryPointPath = 'typo3/sysext/install/Start/';
+    protected $entryPointLevel = 4;
 
     /**
      * All available request handlers that can handle an install tool request
@@ -51,7 +52,7 @@ class Application implements ApplicationInterface
         $this->bootstrap = Bootstrap::getInstance()
             ->initializeClassLoader($classLoader)
             ->setRequestType(TYPO3_REQUESTTYPE_BE | TYPO3_REQUESTTYPE_INSTALL)
-            ->baseSetup($this->entryPointPath);
+            ->baseSetup($this->entryPointLevel);
 
         foreach ($this->availableRequestHandlers as $requestHandler) {
             $this->bootstrap->registerRequestHandlerImplementation($requestHandler);