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:
parent
90837b9175
commit
aa83127686
|
@ -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,
|
||||||
|
|
Loading…
Reference in New Issue