diff options
author | Joas Schilling <coding@schilljs.com> | 2017-05-19 13:48:01 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-19 13:48:01 +0200 |
commit | bcddca9a64fb980019df052a99bc08fbef14b577 (patch) | |
tree | e33d3bc1488dd06f08c5f14723d3fa2326f32ecd /lib | |
parent | dd29e5ab9d107cf01ec9e2833f8fc0f480ccb3c2 (diff) | |
parent | c1cc8193a7484f71190421191ef552ff5bd4578a (diff) | |
download | nextcloud-server-bcddca9a64fb980019df052a99bc08fbef14b577.tar.gz nextcloud-server-bcddca9a64fb980019df052a99bc08fbef14b577.zip |
Merge pull request #4905 from nextcloud/auto-di-for-apps-without-app.php
Allow automatic DI for apps that don't register the container in app.php
Diffstat (limited to 'lib')
-rw-r--r-- | lib/private/ServerContainer.php | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php index 3391dd83a04..97a3b99d534 100644 --- a/lib/private/ServerContainer.php +++ b/lib/private/ServerContainer.php @@ -38,6 +38,9 @@ class ServerContainer extends SimpleContainer { protected $appContainers; /** @var string[] */ + protected $hasNoAppContainer; + + /** @var string[] */ protected $namespaces; /** @@ -47,6 +50,7 @@ class ServerContainer extends SimpleContainer { parent::__construct(); $this->appContainers = []; $this->namespaces = []; + $this->hasNoAppContainer = []; } /** @@ -69,15 +73,27 @@ class ServerContainer extends SimpleContainer { /** * @param string $namespace + * @param string $sensitiveNamespace * @return DIContainer * @throws QueryException */ - protected function getAppContainer($namespace) { + protected function getAppContainer($namespace, $sensitiveNamespace) { if (isset($this->appContainers[$namespace])) { return $this->appContainers[$namespace]; } if (isset($this->namespaces[$namespace])) { + if (!isset($this->hasNoAppContainer[$namespace])) { + $applicationClassName = 'OCA\\' . $sensitiveNamespace . '\\AppInfo\\Application'; + if (class_exists($applicationClassName)) { + new $applicationClassName(); + if (isset($this->appContainers[$namespace])) { + return $this->appContainers[$namespace]; + } + } + $this->hasNoAppContainer[$namespace] = true; + } + return new DIContainer($this->namespaces[$namespace]); } throw new QueryException(); @@ -96,7 +112,7 @@ class ServerContainer extends SimpleContainer { if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) { $segments = explode('\\', $name); try { - $appContainer = $this->getAppContainer(strtolower($segments[1])); + $appContainer = $this->getAppContainer(strtolower($segments[1]), $segments[1]); return $appContainer->queryNoFallback($name); } catch (QueryException $e) { // Didn't find the service or the respective app container, |