From 9667ac2b8e24122cce7e446ff9dc70f6d162389f Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 22 Mar 2017 11:50:58 +0100 Subject: [PATCH] Register the namespace with the autoloading to allow reverse recovery Signed-off-by: Joas Schilling --- lib/private/ServerContainer.php | 32 +++++++++++++++++++++++++------- lib/private/legacy/app.php | 1 + 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php index fe868867b5a..e7b1ed2dad7 100644 --- a/lib/private/ServerContainer.php +++ b/lib/private/ServerContainer.php @@ -37,12 +37,26 @@ class ServerContainer extends SimpleContainer { /** @var DIContainer[] */ protected $appContainers; + /** @var string[] */ + protected $namespaces; + /** * ServerContainer constructor. */ public function __construct() { parent::__construct(); $this->appContainers = []; + $this->namespaces = []; + } + + /** + * @param string $appName + * @param string $appNamespace + */ + public function registerNamespace($appName, $appNamespace) { + // Cut of OCA\ and lowercase + $appNamespace = strtolower(substr($appNamespace, strrpos($appNamespace, '\\') + 1)); + $this->namespaces[$appNamespace] = $appName; } /** @@ -54,15 +68,19 @@ class ServerContainer extends SimpleContainer { } /** - * @param string $appName + * @param string $namespace * @return DIContainer + * @throws QueryException */ - public function getAppContainer($appName) { - if (isset($this->appContainers[$appName])) { - return $this->appContainers[$appName]; + protected function getAppContainer($namespace) { + if (isset($this->appContainers[$namespace])) { + return $this->appContainers[$namespace]; } - return new DIContainer($appName); + if (isset($this->namespaces[$namespace])) { + return new DIContainer($this->namespaces[$namespace]); + } + throw new QueryException(); } /** @@ -77,11 +95,11 @@ class ServerContainer extends SimpleContainer { // the apps container first. if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) { $segments = explode('\\', $name); - $appContainer = $this->getAppContainer(strtolower($segments[1])); try { + $appContainer = $this->getAppContainer(strtolower($segments[1])); return $appContainer->queryNoFallback($name); } catch (QueryException $e) { - // Didn't find the service in the respective app container, + // Didn't find the service or the respective app container, // ignore it and fall back to the core container. } } diff --git a/lib/private/legacy/app.php b/lib/private/legacy/app.php index c82d620882d..5343e7ad172 100644 --- a/lib/private/legacy/app.php +++ b/lib/private/legacy/app.php @@ -189,6 +189,7 @@ class OC_App { self::$alreadyRegistered[$key] = true; // Register on PSR-4 composer autoloader $appNamespace = \OC\AppFramework\App::buildAppNamespace($app); + \OC::$server->registerNamespace($app, $appNamespace); \OC::$composerAutoloader->addPsr4($appNamespace . '\\', $path . '/lib/', true); if (defined('PHPUNIT_RUN') || defined('CLI_TEST_RUN')) { \OC::$composerAutoloader->addPsr4($appNamespace . '\\Tests\\', $path . '/tests/', true); -- 2.39.5