Allow automatic DI for apps that don't register the container in app.php

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2017-05-16 17:37:41 +02:00
parent 90837b9175
commit aa83127686
No known key found for this signature in database
GPG Key ID: E166FD8976B3BAC8
1 changed files with 18 additions and 2 deletions

View File

@ -37,6 +37,9 @@ class ServerContainer extends SimpleContainer {
/** @var DIContainer[] */ /** @var DIContainer[] */
protected $appContainers; protected $appContainers;
/** @var string[] */
protected $hasNoAppContainer;
/** @var string[] */ /** @var string[] */
protected $namespaces; protected $namespaces;
@ -47,6 +50,7 @@ class ServerContainer extends SimpleContainer {
parent::__construct(); parent::__construct();
$this->appContainers = []; $this->appContainers = [];
$this->namespaces = []; $this->namespaces = [];
$this->hasNoAppContainer = [];
} }
/** /**
@ -69,15 +73,27 @@ class ServerContainer extends SimpleContainer {
/** /**
* @param string $namespace * @param string $namespace
* @param string $sensitiveNamespace
* @return DIContainer * @return DIContainer
* @throws QueryException * @throws QueryException
*/ */
protected function getAppContainer($namespace) { protected function getAppContainer($namespace, $sensitiveNamespace) {
if (isset($this->appContainers[$namespace])) { if (isset($this->appContainers[$namespace])) {
return $this->appContainers[$namespace]; return $this->appContainers[$namespace];
} }
if (isset($this->namespaces[$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]); return new DIContainer($this->namespaces[$namespace]);
} }
throw new QueryException(); throw new QueryException();
@ -96,7 +112,7 @@ class ServerContainer extends SimpleContainer {
if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) { if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
$segments = explode('\\', $name); $segments = explode('\\', $name);
try { try {
$appContainer = $this->getAppContainer(strtolower($segments[1])); $appContainer = $this->getAppContainer(strtolower($segments[1]), $segments[1]);
return $appContainer->queryNoFallback($name); return $appContainer->queryNoFallback($name);
} catch (QueryException $e) { } catch (QueryException $e) {
// Didn't find the service or the respective app container, // Didn't find the service or the respective app container,