diff options
-rw-r--r-- | lib/private/App/AppManager.php | 19 | ||||
-rw-r--r-- | lib/private/Server.php | 1 | ||||
-rw-r--r-- | tests/lib/App/AppManagerTest.php | 9 |
3 files changed, 19 insertions, 10 deletions
diff --git a/lib/private/App/AppManager.php b/lib/private/App/AppManager.php index 65a1e9e1e7e..3867dcc509e 100644 --- a/lib/private/App/AppManager.php +++ b/lib/private/App/AppManager.php @@ -98,7 +98,12 @@ class AppManager implements IAppManager { private array $loadedApps = []; private ?AppConfig $appConfig = null; + private ?IURLGenerator $urlGenerator = null; + /** + * Be extremely careful when injecting classes here. The AppManager is used by the installer, + * so it needs to work before installation. See how AppConfig and IURLGenerator are injected for reference + */ public function __construct( private IUserSession $userSession, private IConfig $config, @@ -106,7 +111,6 @@ class AppManager implements IAppManager { private ICacheFactory $memCacheFactory, private IEventDispatcher $dispatcher, private LoggerInterface $logger, - private IURLGenerator $urlGenerator, ) { } @@ -115,7 +119,7 @@ class AppManager implements IAppManager { $icon = null; foreach ($possibleIcons as $iconName) { try { - $icon = $this->urlGenerator->imagePath($appId, $iconName); + $icon = $this->getUrlGenerator()->imagePath($appId, $iconName); break; } catch (\RuntimeException $e) { // ignore @@ -135,6 +139,17 @@ class AppManager implements IAppManager { return $this->appConfig; } + private function getUrlGenerator(): IURLGenerator { + if ($this->urlGenerator !== null) { + return $this->urlGenerator; + } + if (!$this->config->getSystemValueBool('installed', false)) { + throw new \Exception('Nextcloud is not installed yet, AppConfig is not available'); + } + $this->urlGenerator = \OCP\Server::get(IURLGenerator::class); + return $this->urlGenerator; + } + /** * @return string[] $appId => $enabled */ diff --git a/lib/private/Server.php b/lib/private/Server.php index 2257513147c..21d60d55829 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -897,7 +897,6 @@ class Server extends ServerContainer implements IServerContainer { $c->get(ICacheFactory::class), $c->get(IEventDispatcher::class), $c->get(LoggerInterface::class), - $c->get(IURLGenerator::class), ); }); /** @deprecated 19.0.0 */ diff --git a/tests/lib/App/AppManagerTest.php b/tests/lib/App/AppManagerTest.php index 88f2bd9873b..756c29972b1 100644 --- a/tests/lib/App/AppManagerTest.php +++ b/tests/lib/App/AppManagerTest.php @@ -99,7 +99,7 @@ class AppManagerTest extends TestCase { /** @var LoggerInterface|MockObject */ protected $logger; - protected IURLGenerator|MockObject $urlGenerator; + protected IURLGenerator&MockObject $urlGenerator; /** @var IAppManager */ protected $manager; @@ -118,6 +118,7 @@ class AppManagerTest extends TestCase { $this->urlGenerator = $this->createMock(IURLGenerator::class); $this->overwriteService(AppConfig::class, $this->appConfig); + $this->overwriteService(IURLGenerator::class, $this->urlGenerator); $this->cacheFactory->expects($this->any()) ->method('createDistributed') @@ -136,7 +137,6 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, - $this->urlGenerator, ); } @@ -279,7 +279,6 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, - $this->urlGenerator, ]) ->onlyMethods([ 'getAppPath', @@ -333,7 +332,6 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, - $this->urlGenerator, ]) ->onlyMethods([ 'getAppPath', @@ -395,7 +393,6 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, - $this->urlGenerator, ]) ->onlyMethods([ 'getAppPath', @@ -598,7 +595,6 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, - $this->urlGenerator, ]) ->onlyMethods(['getAppInfo']) ->getMock(); @@ -657,7 +653,6 @@ class AppManagerTest extends TestCase { $this->cacheFactory, $this->eventDispatcher, $this->logger, - $this->urlGenerator, ]) ->onlyMethods(['getAppInfo']) ->getMock(); |