Merge pull request #3977 from nextcloud/di_ng2
Make DI work for all apps
This commit is contained in:
commit
0b5e1814be
|
@ -61,11 +61,12 @@ class App {
|
||||||
|
|
||||||
$appInfo = \OC_App::getAppInfo($appId);
|
$appInfo = \OC_App::getAppInfo($appId);
|
||||||
if (isset($appInfo['namespace'])) {
|
if (isset($appInfo['namespace'])) {
|
||||||
return $topNamespace . trim($appInfo['namespace']);
|
self::$nameSpaceCache[$appId] = trim($appInfo['namespace']);
|
||||||
|
} else {
|
||||||
|
// if the tag is not found, fall back to uppercasing the first letter
|
||||||
|
self::$nameSpaceCache[$appId] = ucfirst($appId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the tag is not found, fall back to uppercasing the first letter
|
|
||||||
self::$nameSpaceCache[$appId] = ucfirst($appId);
|
|
||||||
return $topNamespace . self::$nameSpaceCache[$appId];
|
return $topNamespace . self::$nameSpaceCache[$appId];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ use OC\ServerContainer;
|
||||||
use OCP\AppFramework\Http\IOutput;
|
use OCP\AppFramework\Http\IOutput;
|
||||||
use OCP\AppFramework\IApi;
|
use OCP\AppFramework\IApi;
|
||||||
use OCP\AppFramework\IAppContainer;
|
use OCP\AppFramework\IAppContainer;
|
||||||
|
use OCP\AppFramework\QueryException;
|
||||||
use OCP\Files\Folder;
|
use OCP\Files\Folder;
|
||||||
use OCP\Files\IAppData;
|
use OCP\Files\IAppData;
|
||||||
use OCP\IL10N;
|
use OCP\IL10N;
|
||||||
|
@ -373,24 +374,40 @@ class DIContainer extends SimpleContainer implements IAppContainer {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
* @return mixed
|
||||||
|
* @throws QueryException if the query could not be resolved
|
||||||
|
*/
|
||||||
public function query($name) {
|
public function query($name) {
|
||||||
|
try {
|
||||||
|
return $this->queryNoFallback($name);
|
||||||
|
} catch (QueryException $e) {
|
||||||
|
return $this->getServer()->query($name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param string $name
|
||||||
|
* @return mixed
|
||||||
|
* @throws QueryException if the query could not be resolved
|
||||||
|
*/
|
||||||
|
public function queryNoFallback($name) {
|
||||||
$name = $this->sanitizeName($name);
|
$name = $this->sanitizeName($name);
|
||||||
|
|
||||||
if ($this->offsetExists($name)) {
|
if ($this->offsetExists($name)) {
|
||||||
return parent::query($name);
|
return parent::query($name);
|
||||||
} else {
|
} else {
|
||||||
if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
|
if ($this['AppName'] === 'settings' && strpos($name, 'OC\\Settings\\') === 0) {
|
||||||
$segments = explode('\\', $name);
|
|
||||||
if (strtolower($segments[1]) === strtolower($this['AppName'])) {
|
|
||||||
return parent::query($name);
|
|
||||||
}
|
|
||||||
} else if ($this['AppName'] === 'settings' && strpos($name, 'OC\\Settings\\') === 0) {
|
|
||||||
return parent::query($name);
|
return parent::query($name);
|
||||||
} else if ($this['AppName'] === 'core' && strpos($name, 'OC\\Core\\') === 0) {
|
} else if ($this['AppName'] === 'core' && strpos($name, 'OC\\Core\\') === 0) {
|
||||||
return parent::query($name);
|
return parent::query($name);
|
||||||
|
} else if (strpos($name, \OC\AppFramework\App::buildAppNamespace($this['AppName']) . '\\') === 0) {
|
||||||
|
return parent::query($name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $this->getServer()->query($name);
|
throw new QueryException('Could not resolve ' . $name . '!' .
|
||||||
|
' Class can not be instantiated');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,12 +37,26 @@ class ServerContainer extends SimpleContainer {
|
||||||
/** @var DIContainer[] */
|
/** @var DIContainer[] */
|
||||||
protected $appContainers;
|
protected $appContainers;
|
||||||
|
|
||||||
|
/** @var string[] */
|
||||||
|
protected $namespaces;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ServerContainer constructor.
|
* ServerContainer constructor.
|
||||||
*/
|
*/
|
||||||
public function __construct() {
|
public function __construct() {
|
||||||
parent::__construct();
|
parent::__construct();
|
||||||
$this->appContainers = [];
|
$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
|
* @return DIContainer
|
||||||
|
* @throws QueryException
|
||||||
*/
|
*/
|
||||||
public function getAppContainer($appName) {
|
protected function getAppContainer($namespace) {
|
||||||
if (isset($this->appContainers[$appName])) {
|
if (isset($this->appContainers[$namespace])) {
|
||||||
return $this->appContainers[$appName];
|
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.
|
// the apps container first.
|
||||||
if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
|
if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) {
|
||||||
$segments = explode('\\', $name);
|
$segments = explode('\\', $name);
|
||||||
$appContainer = $this->getAppContainer(strtolower($segments[1]));
|
|
||||||
try {
|
try {
|
||||||
return $appContainer->query($name);
|
$appContainer = $this->getAppContainer(strtolower($segments[1]));
|
||||||
|
return $appContainer->queryNoFallback($name);
|
||||||
} catch (QueryException $e) {
|
} 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.
|
// ignore it and fall back to the core container.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,6 +189,7 @@ class OC_App {
|
||||||
self::$alreadyRegistered[$key] = true;
|
self::$alreadyRegistered[$key] = true;
|
||||||
// Register on PSR-4 composer autoloader
|
// Register on PSR-4 composer autoloader
|
||||||
$appNamespace = \OC\AppFramework\App::buildAppNamespace($app);
|
$appNamespace = \OC\AppFramework\App::buildAppNamespace($app);
|
||||||
|
\OC::$server->registerNamespace($app, $appNamespace);
|
||||||
\OC::$composerAutoloader->addPsr4($appNamespace . '\\', $path . '/lib/', true);
|
\OC::$composerAutoloader->addPsr4($appNamespace . '\\', $path . '/lib/', true);
|
||||||
if (defined('PHPUNIT_RUN') || defined('CLI_TEST_RUN')) {
|
if (defined('PHPUNIT_RUN') || defined('CLI_TEST_RUN')) {
|
||||||
\OC::$composerAutoloader->addPsr4($appNamespace . '\\Tests\\', $path . '/tests/', true);
|
\OC::$composerAutoloader->addPsr4($appNamespace . '\\Tests\\', $path . '/tests/', true);
|
||||||
|
|
|
@ -62,6 +62,7 @@ interface IContainer {
|
||||||
*
|
*
|
||||||
* @param string $name
|
* @param string $name
|
||||||
* @return mixed
|
* @return mixed
|
||||||
|
* @throws QueryException if the query could not be resolved
|
||||||
* @since 6.0.0
|
* @since 6.0.0
|
||||||
*/
|
*/
|
||||||
public function query($name);
|
public function query($name);
|
||||||
|
|
|
@ -68,7 +68,7 @@ class ManagerTest extends TestCase {
|
||||||
parent::setUp();
|
parent::setUp();
|
||||||
|
|
||||||
$this->user = $this->createMock(IUser::class);
|
$this->user = $this->createMock(IUser::class);
|
||||||
$this->appManager = $this->createMock('\OC\App\AppManager');
|
$this->appManager = $this->createMock(AppManager::class);
|
||||||
$this->session = $this->createMock(ISession::class);
|
$this->session = $this->createMock(ISession::class);
|
||||||
$this->config = $this->createMock(IConfig::class);
|
$this->config = $this->createMock(IConfig::class);
|
||||||
$this->activityManager = $this->createMock(IManager::class);
|
$this->activityManager = $this->createMock(IManager::class);
|
||||||
|
|
|
@ -63,6 +63,14 @@ class InfoXmlTest extends TestCase {
|
||||||
$appPath = \OC_App::getAppPath($app);
|
$appPath = \OC_App::getAppPath($app);
|
||||||
\OC_App::registerAutoloading($app, $appPath);
|
\OC_App::registerAutoloading($app, $appPath);
|
||||||
|
|
||||||
|
//Add the appcontainer
|
||||||
|
$applicationClassName = \OCP\AppFramework\App::buildAppNamespace($app) . '\\AppInfo\\Application';
|
||||||
|
if (class_exists($applicationClassName)) {
|
||||||
|
$application = new $applicationClassName();
|
||||||
|
} else {
|
||||||
|
$application = new \OCP\AppFramework\App($app);
|
||||||
|
}
|
||||||
|
|
||||||
if (isset($appInfo['background-jobs'])) {
|
if (isset($appInfo['background-jobs'])) {
|
||||||
foreach ($appInfo['background-jobs'] as $job) {
|
foreach ($appInfo['background-jobs'] as $job) {
|
||||||
$this->assertTrue(class_exists($job), 'Asserting background job "' . $job . '" exists');
|
$this->assertTrue(class_exists($job), 'Asserting background job "' . $job . '" exists');
|
||||||
|
|
Loading…
Reference in New Issue