summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorJoas Schilling <coding@schilljs.com>2017-05-19 13:48:01 +0200
committerGitHub <noreply@github.com>2017-05-19 13:48:01 +0200
commitbcddca9a64fb980019df052a99bc08fbef14b577 (patch)
treee33d3bc1488dd06f08c5f14723d3fa2326f32ecd /lib
parentdd29e5ab9d107cf01ec9e2833f8fc0f480ccb3c2 (diff)
parentc1cc8193a7484f71190421191ef552ff5bd4578a (diff)
downloadnextcloud-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.php20
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,