diff --git a/installation/src/Application/InstallationApplication.php b/installation/src/Application/InstallationApplication.php index 141c034ce4668..c6772a2cabe1e 100644 --- a/installation/src/Application/InstallationApplication.php +++ b/installation/src/Application/InstallationApplication.php @@ -75,11 +75,6 @@ public function __construct(?Input $input = null, ?Registry $config = null, ?Web // Register the config to Factory. Factory::$config = $this->config; - - // Set the root in the URI one level up. - $parts = explode('/', Uri::base(true)); - array_pop($parts); - Uri::root(null, implode('/', $parts)); } /** @@ -237,6 +232,11 @@ protected function doExecute() */ public function execute() { + // Set the root in the URI one level up. + $parts = explode('/', Uri::base(true)); + array_pop($parts); + Uri::root(null, implode('/', $parts)); + try { // Perform application routines. $this->doExecute(); diff --git a/libraries/src/Application/AdministratorApplication.php b/libraries/src/Application/AdministratorApplication.php index 78a793c6c7896..c0997c80d3248 100644 --- a/libraries/src/Application/AdministratorApplication.php +++ b/libraries/src/Application/AdministratorApplication.php @@ -81,9 +81,6 @@ public function __construct(?Input $input = null, ?Registry $config = null, ?Web // Execute the parent constructor parent::__construct($input, $config, $client, $container); - - // Set the root in the URI based on the application name - Uri::root(null, rtrim(\dirname(Uri::base(true)), '/\\')); } /** @@ -508,4 +505,17 @@ public function findOption(): string return $option; } + + /** + * Hook to allow applications to configure anything inside the static variables of \Joomla\CMS\Uri\Uri. + * + * @return void + * + * @since __DEPLOY_VERSION__ + */ + protected function configureBaseUrlForApplication(): void + { + // Set the root in the URI based on the application name + Uri::root(null, rtrim(\dirname(Uri::base(true)), '/\\')); + } } diff --git a/libraries/src/Application/ApiApplication.php b/libraries/src/Application/ApiApplication.php index 188f8509dfb26..23013c1976705 100644 --- a/libraries/src/Application/ApiApplication.php +++ b/libraries/src/Application/ApiApplication.php @@ -84,9 +84,6 @@ public function __construct(?JInputJson $input = null, ?Registry $config = null, $this->addFormatMap('application/json', 'json'); $this->addFormatMap('application/vnd.api+json', 'jsonapi'); - - // Set the root in the URI based on the application name - Uri::root(null, str_ireplace('/' . $this->getName(), '', Uri::base(true))); } /** @@ -439,4 +436,17 @@ public function dispatch($component = null) new AfterDispatchEvent('onAfterDispatch', ['subject' => $this]) ); } + + /** + * Hook to allow applications to configure anything inside the static variables of \Joomla\CMS\Uri\Uri. + * + * @return void + * + * @since __DEPLOY_VERSION__ + */ + protected function configureBaseUrlForApplication(): void + { + // Set the root in the URI based on the application name + Uri::root(null, rtrim(\dirname(Uri::base(true)), '/\\')); + } } diff --git a/libraries/src/Application/CMSApplication.php b/libraries/src/Application/CMSApplication.php index f9a69ec9ed455..8d689889d37c3 100644 --- a/libraries/src/Application/CMSApplication.php +++ b/libraries/src/Application/CMSApplication.php @@ -298,6 +298,7 @@ function ($systemVariable) use ($input) { public function execute() { try { + $this->configureBaseUrlForApplication(); $this->sanityCheckSystemVariables(); $this->setupLogging(); $this->createExtensionNamespaceMap(); @@ -1359,4 +1360,15 @@ public function setMenuFactory(MenuFactoryInterface $menuFactory): void { $this->menuFactory = $menuFactory; } + + /** + * Hook to allow applications to configure anything inside the static variables of \Joomla\CMS\Uri\Uri. + * + * @return void + * + * @since __DEPLOY_VERSION__ + */ + protected function configureBaseUrlForApplication(): void + { + } } diff --git a/libraries/src/Application/ConsoleApplication.php b/libraries/src/Application/ConsoleApplication.php index 5941c4225c993..1923fafd8bc9e 100644 --- a/libraries/src/Application/ConsoleApplication.php +++ b/libraries/src/Application/ConsoleApplication.php @@ -529,14 +529,7 @@ protected function populateHttpHost() $uri = Uri::getInstance('https://joomla.invalid/set/by/console/application'); } - /** - * Yes, this is icky but it is the only way to trick WebApplication into compliance. - * - * @see \Joomla\Application\AbstractWebApplication::detectRequestUri - */ - $_SERVER['HTTP_HOST'] = $uri->toString(['host', 'port']); - $_SERVER['REQUEST_URI'] = $uri->getPath(); - $_SERVER['HTTPS'] = $uri->getScheme() === 'https' ? 'on' : 'off'; + $this->set('uri.request', $uri->toString()); } /** diff --git a/libraries/src/Uri/Uri.php b/libraries/src/Uri/Uri.php index e07db2a2683de..853d7c218b2a5 100644 --- a/libraries/src/Uri/Uri.php +++ b/libraries/src/Uri/Uri.php @@ -64,6 +64,20 @@ public static function getInstance($uri = 'SERVER') if (empty(static::$instances[$uri])) { // Are we obtaining the URI from the server? if ($uri === 'SERVER') { + try { + $applicationUriRequest = Factory::getApplication()->get('uri.request'); + + if ($applicationUriRequest !== null) { + static::$instances[$uri] = new static($applicationUriRequest); + + return static::$instances[$uri]; + } + } catch (\Exception $e) { + @trigger_error('The application should be set into Factory', E_USER_DEPRECATED); + } + + @trigger_error('The application should provide the request URI from Joomla 5.0.0', E_USER_DEPRECATED); + // Determine if the request was over SSL (HTTPS). if (isset($_SERVER['HTTPS']) && !empty($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) !== 'off')) { $https = 's://';