diff --git a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php
index f4a2cd500e150..2fa4d7c668f50 100644
--- a/apps/files_sharing/lib/Controller/DeletedShareAPIController.php
+++ b/apps/files_sharing/lib/Controller/DeletedShareAPIController.php
@@ -23,8 +23,8 @@
use OCP\Files\NotFoundException;
use OCP\IGroupManager;
use OCP\IRequest;
-use OCP\IServerContainer;
use OCP\IUserManager;
+use OCP\Server;
use OCP\Share\Exceptions\GenericShareException;
use OCP\Share\Exceptions\ShareNotFound;
use OCP\Share\IManager as ShareManager;
@@ -44,7 +44,6 @@ public function __construct(
private IGroupManager $groupManager,
private IRootFolder $rootFolder,
private IAppManager $appManager,
- private IServerContainer $serverContainer,
) {
parent::__construct($appName, $request);
}
@@ -202,7 +201,7 @@ private function getRoomShareHelper() {
throw new QueryException();
}
- return $this->serverContainer->get('\OCA\Talk\Share\Helper\DeletedShareAPIController');
+ return Server::get('\OCA\Talk\Share\Helper\DeletedShareAPIController');
}
/**
@@ -219,7 +218,7 @@ private function getDeckShareHelper() {
throw new QueryException();
}
- return $this->serverContainer->get('\OCA\Deck\Sharing\ShareAPIHelper');
+ return Server::get('\OCA\Deck\Sharing\ShareAPIHelper');
}
/**
@@ -236,6 +235,6 @@ private function getSciencemeshShareHelper() {
throw new QueryException();
}
- return $this->serverContainer->get('\OCA\ScienceMesh\Sharing\ShareAPIHelper');
+ return Server::get('\OCA\ScienceMesh\Sharing\ShareAPIHelper');
}
}
diff --git a/apps/settings/tests/AppInfo/ApplicationTest.php b/apps/settings/tests/AppInfo/ApplicationTest.php
index b09412d838790..3e895d87b06a3 100644
--- a/apps/settings/tests/AppInfo/ApplicationTest.php
+++ b/apps/settings/tests/AppInfo/ApplicationTest.php
@@ -39,7 +39,7 @@ protected function setUp(): void {
public function testContainerAppName(): void {
$this->app = new Application();
- $this->assertEquals('settings', $this->container->getAppName());
+ $this->assertEquals('settings', $this->container->get('appName'));
}
public static function dataContainerQuery(): array {
diff --git a/build/psalm-baseline.xml b/build/psalm-baseline.xml
index e40c10bfc6727..72b6311b2fc0f 100644
--- a/build/psalm-baseline.xml
+++ b/build/psalm-baseline.xml
@@ -1581,9 +1581,6 @@
-
-
-
@@ -3364,18 +3361,12 @@
-
-
-
server]]>
-
-
-
diff --git a/lib/private/AppFramework/App.php b/lib/private/AppFramework/App.php
index c5f61d7e9388e..e719ea19f90f4 100644
--- a/lib/private/AppFramework/App.php
+++ b/lib/private/AppFramework/App.php
@@ -101,7 +101,7 @@ public static function main(string $controllerName, string $methodName, DIContai
$profiler->setEnabled($profiler->isEnabled() && !is_null($urlParams) && isset($urlParams['_route']) && !str_starts_with($urlParams['_route'], 'profiler.'));
if ($profiler->isEnabled()) {
\OC::$server->get(IEventLogger::class)->activate();
- $profiler->add(new RoutingDataCollector($container['AppName'], $controllerName, $methodName));
+ $profiler->add(new RoutingDataCollector($container['appName'], $controllerName, $methodName));
}
$eventLogger->start('app:controller:params', 'Gather controller parameters');
@@ -115,7 +115,7 @@ public static function main(string $controllerName, string $methodName, DIContai
$request = $container->get(IRequest::class);
$request->setUrlParameters($container['urlParams']);
}
- $appName = $container['AppName'];
+ $appName = $container['appName'];
$eventLogger->end('app:controller:params');
diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php
index 87361a9d1ea8f..5ccc1b7d34883 100644
--- a/lib/private/AppFramework/DependencyInjection/DIContainer.php
+++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php
@@ -1,21 +1,33 @@
appName = $appName;
- $this['appName'] = $appName;
- $this['urlParams'] = $urlParams;
+ $this->registerParameter('appName', $appName);
+ $this->registerParameter('urlParams', $urlParams);
- $this->registerAlias('Request', IRequest::class);
+ /** @deprecated 32.0.0 */
+ $this->registerDeprecatedAlias('Request', IRequest::class);
- /** @var \OC\ServerContainer $server */
if ($server === null) {
$server = \OC::$server;
}
@@ -90,74 +84,73 @@ public function __construct(string $appName, array $urlParams = [], ?ServerConta
// aliases
/** @deprecated 26.0.0 inject $appName */
- $this->registerAlias('AppName', 'appName');
+ $this->registerDeprecatedAlias('AppName', 'appName');
/** @deprecated 26.0.0 inject $webRoot*/
- $this->registerAlias('WebRoot', 'webRoot');
+ $this->registerDeprecatedAlias('WebRoot', 'webRoot');
/** @deprecated 26.0.0 inject $userId */
- $this->registerAlias('UserId', 'userId');
+ $this->registerDeprecatedAlias('UserId', 'userId');
/**
* Core services
*/
- $this->registerService(IOutput::class, function () {
- return new Output($this->getServer()->getWebRoot());
- });
+ /* Cannot be an alias because Output is not in OCA */
+ $this->registerService(IOutput::class, fn (ContainerInterface $c): IOutput => new Output($c->get('webRoot')));
$this->registerService(Folder::class, function () {
return $this->getServer()->getUserFolder();
});
- $this->registerService(IAppData::class, function (ContainerInterface $c) {
- return $this->getServer()->getAppDataDir($c->get('AppName'));
+ $this->registerService(IAppData::class, function (ContainerInterface $c): IAppData {
+ return $c->get(IAppDataFactory::class)->get($c->get('appName'));
});
$this->registerService(IL10N::class, function (ContainerInterface $c) {
- return $this->getServer()->getL10N($c->get('AppName'));
+ return $this->getServer()->getL10N($c->get('appName'));
});
// Log wrappers
$this->registerService(LoggerInterface::class, function (ContainerInterface $c) {
+ /* Cannot be an alias because it uses LoggerInterface so it would infinite loop */
return new ScopedPsrLogger(
$c->get(PsrLoggerAdapter::class),
- $c->get('AppName')
+ $c->get('appName')
);
});
$this->registerService(IServerContainer::class, function () {
return $this->getServer();
});
- $this->registerAlias('ServerContainer', IServerContainer::class);
+ /** @deprecated 32.0.0 */
+ $this->registerDeprecatedAlias('ServerContainer', IServerContainer::class);
- $this->registerService(\OCP\WorkflowEngine\IManager::class, function (ContainerInterface $c) {
- return $c->get(Manager::class);
- });
+ $this->registerAlias(\OCP\WorkflowEngine\IManager::class, Manager::class);
- $this->registerService(ContainerInterface::class, function (ContainerInterface $c) {
- return $c;
- });
- $this->registerAlias(IAppContainer::class, ContainerInterface::class);
+ $this->registerService(ContainerInterface::class, fn (ContainerInterface $c) => $c);
+ $this->registerDeprecatedAlias(IAppContainer::class, ContainerInterface::class);
// commonly used attributes
- $this->registerService('userId', function (ContainerInterface $c) {
- return $c->get(IUserSession::class)->getSession()->get('user_id');
+ $this->registerService('userId', function (ContainerInterface $c): ?string {
+ return $c->get(ISession::class)->get('user_id');
});
- $this->registerService('webRoot', function (ContainerInterface $c) {
+ $this->registerService('webRoot', function (ContainerInterface $c): string {
return $c->get(IServerContainer::class)->getWebRoot();
});
- $this->registerService('OC_Defaults', function (ContainerInterface $c) {
+ $this->registerService('OC_Defaults', function (ContainerInterface $c): object {
return $c->get(IServerContainer::class)->get('ThemingDefaults');
});
- $this->registerService('Protocol', function (ContainerInterface $c) {
- /** @var \OC\Server $server */
- $server = $c->get(IServerContainer::class);
- $protocol = $server->getRequest()->getHttpProtocol();
+ /** @deprecated 32.0.0 */
+ $this->registerDeprecatedAlias('Protocol', Http::class);
+ $this->registerService(Http::class, function (ContainerInterface $c) {
+ $protocol = $c->get(IRequest::class)->getHttpProtocol();
return new Http($_SERVER, $protocol);
});
- $this->registerService('Dispatcher', function (ContainerInterface $c) {
+ /** @deprecated 32.0.0 */
+ $this->registerDeprecatedAlias('Dispatcher', Dispatcher::class);
+ $this->registerService(Dispatcher::class, function (ContainerInterface $c) {
return new Dispatcher(
$c->get('Protocol'),
$c->get(MiddlewareDispatcher::class),
@@ -181,42 +174,19 @@ public function __construct(string $appName, array $urlParams = [], ?ServerConta
/**
* Middleware
*/
- $this->registerAlias('MiddlewareDispatcher', MiddlewareDispatcher::class);
+ /** @deprecated 32.0.0 */
+ $this->registerDeprecatedAlias('MiddlewareDispatcher', MiddlewareDispatcher::class);
$this->registerService(MiddlewareDispatcher::class, function (ContainerInterface $c) {
$server = $this->getServer();
$dispatcher = new MiddlewareDispatcher();
- $dispatcher->registerMiddleware(
- $c->get(OC\AppFramework\Middleware\CompressionMiddleware::class)
- );
-
- $dispatcher->registerMiddleware($c->get(OC\AppFramework\Middleware\NotModifiedMiddleware::class));
-
- $dispatcher->registerMiddleware(
- $c->get(OC\AppFramework\Middleware\Security\ReloadExecutionMiddleware::class)
- );
-
- $dispatcher->registerMiddleware(
- new OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware(
- $c->get(IRequest::class),
- $c->get(IControllerMethodReflector::class)
- )
- );
- $dispatcher->registerMiddleware(
- new CORSMiddleware(
- $c->get(IRequest::class),
- $c->get(IControllerMethodReflector::class),
- $c->get(IUserSession::class),
- $c->get(IThrottler::class),
- $c->get(LoggerInterface::class)
- )
- );
- $dispatcher->registerMiddleware(
- new OCSMiddleware(
- $c->get(IRequest::class)
- )
- );
+ $dispatcher->registerMiddleware($c->get(CompressionMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(NotModifiedMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(ReloadExecutionMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(SameSiteCookieMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(CORSMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(OCSMiddleware::class));
$dispatcher->registerMiddleware($c->get(FlowV2EphemeralSessionsMiddleware::class));
@@ -225,75 +195,31 @@ public function __construct(string $appName, array $urlParams = [], ?ServerConta
$c->get(IControllerMethodReflector::class),
$c->get(INavigationManager::class),
$c->get(IURLGenerator::class),
- $server->get(LoggerInterface::class),
- $c->get('AppName'),
+ $c->get(LoggerInterface::class),
+ $c->get('appName'),
$server->getUserSession()->isLoggedIn(),
$c->get(IGroupManager::class),
$c->get(ISubAdmin::class),
$server->getAppManager(),
$server->getL10N('lib'),
$c->get(AuthorizedGroupMapper::class),
- $server->get(IUserSession::class),
+ $c->get(IUserSession::class),
$c->get(IRemoteAddress::class),
);
$dispatcher->registerMiddleware($securityMiddleware);
- $dispatcher->registerMiddleware(
- new OC\AppFramework\Middleware\Security\CSPMiddleware(
- $server->query(OC\Security\CSP\ContentSecurityPolicyManager::class),
- $server->query(OC\Security\CSP\ContentSecurityPolicyNonceManager::class),
- )
- );
- $dispatcher->registerMiddleware(
- $server->query(OC\AppFramework\Middleware\Security\FeaturePolicyMiddleware::class)
- );
- $dispatcher->registerMiddleware(
- new OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware(
- $c->get(IControllerMethodReflector::class),
- $c->get(ISession::class),
- $c->get(IUserSession::class),
- $c->get(ITimeFactory::class),
- $c->get(\OC\Authentication\Token\IProvider::class),
- $c->get(LoggerInterface::class),
- $c->get(IRequest::class),
- $c->get(UserManager::class),
- )
- );
- $dispatcher->registerMiddleware(
- new TwoFactorMiddleware(
- $c->get(OC\Authentication\TwoFactorAuth\Manager::class),
- $c->get(IUserSession::class),
- $c->get(ISession::class),
- $c->get(IURLGenerator::class),
- $c->get(IControllerMethodReflector::class),
- $c->get(IRequest::class)
- )
- );
- $dispatcher->registerMiddleware(
- new OC\AppFramework\Middleware\Security\BruteForceMiddleware(
- $c->get(IControllerMethodReflector::class),
- $c->get(IThrottler::class),
- $c->get(IRequest::class),
- $c->get(LoggerInterface::class)
- )
- );
+ $dispatcher->registerMiddleware($c->get(CSPMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(FeaturePolicyMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(PasswordConfirmationMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(TwoFactorMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(BruteForceMiddleware::class));
$dispatcher->registerMiddleware($c->get(RateLimitingMiddleware::class));
- $dispatcher->registerMiddleware(
- new OC\AppFramework\Middleware\PublicShare\PublicShareMiddleware(
- $c->get(IRequest::class),
- $c->get(ISession::class),
- $c->get(IConfig::class),
- $c->get(IThrottler::class)
- )
- );
- $dispatcher->registerMiddleware(
- $c->get(\OC\AppFramework\Middleware\AdditionalScriptsMiddleware::class)
- );
+ $dispatcher->registerMiddleware($c->get(PublicShareMiddleware::class));
+ $dispatcher->registerMiddleware($c->get(AdditionalScriptsMiddleware::class));
- /** @var \OC\AppFramework\Bootstrap\Coordinator $coordinator */
$coordinator = $c->get(\OC\AppFramework\Bootstrap\Coordinator::class);
$registrationContext = $coordinator->getRegistrationContext();
if ($registrationContext !== null) {
- $appId = $this->getAppName();
+ $appId = $this->get('appName');
foreach ($registrationContext->getMiddlewareRegistrations() as $middlewareRegistration) {
if ($middlewareRegistration->getAppId() === $appId
|| $middlewareRegistration->isGlobal()) {
@@ -305,28 +231,12 @@ public function __construct(string $appName, array $urlParams = [], ?ServerConta
$dispatcher->registerMiddleware($c->get($middleWare));
}
- $dispatcher->registerMiddleware(
- new SessionMiddleware(
- $c->get(IControllerMethodReflector::class),
- $c->get(ISession::class)
- )
- );
+ $dispatcher->registerMiddleware($c->get(SessionMiddleware::class));
return $dispatcher;
});
- $this->registerService(IAppConfig::class, function (ContainerInterface $c) {
- return new OC\AppFramework\Services\AppConfig(
- $c->get(IConfig::class),
- $c->get(\OCP\IAppConfig::class),
- $c->get('AppName')
- );
- });
- $this->registerService(IInitialState::class, function (ContainerInterface $c) {
- return new OC\AppFramework\Services\InitialState(
- $c->get(IInitialStateService::class),
- $c->get('AppName')
- );
- });
+ $this->registerAlias(IAppConfig::class, \OC\AppFramework\Services\AppConfig::class);
+ $this->registerAlias(IInitialState::class, \OC\AppFramework\Services\InitialState::class);
}
/**
@@ -338,13 +248,13 @@ public function getServer() {
/**
* @param string $middleWare
- * @return boolean|null
*/
- public function registerMiddleWare($middleWare) {
+ public function registerMiddleWare($middleWare): bool {
if (in_array($middleWare, $this->middleWares, true) !== false) {
return false;
}
$this->middleWares[] = $middleWare;
+ return true;
}
/**
@@ -352,7 +262,7 @@ public function registerMiddleWare($middleWare) {
* @return string the name of your application
*/
public function getAppName() {
- return $this->query('AppName');
+ return $this->query('appName');
}
/**
@@ -372,7 +282,7 @@ public function isAdminUser() {
return \OC_User::isAdminUser($uid);
}
- private function getUserId() {
+ private function getUserId(): string {
return $this->getServer()->getSession()->get('user_id');
}
@@ -439,6 +349,12 @@ public function queryNoFallback($name) {
return parent::query($name);
} elseif (str_starts_with($name, \OC\AppFramework\App::buildAppNamespace($this->appName) . '\\')) {
return parent::query($name);
+ } elseif (
+ str_starts_with($name, 'OC\\AppFramework\\Services\\')
+ || str_starts_with($name, 'OC\\AppFramework\\Middleware\\')
+ ) {
+ /* AppFramework services are scoped to the application */
+ return parent::query($name);
}
throw new QueryException('Could not resolve ' . $name . '!'
diff --git a/lib/private/AppFramework/Http/Dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php
index d129a7d770b1f..8d91ddf7502ca 100644
--- a/lib/private/AppFramework/Http/Dispatcher.php
+++ b/lib/private/AppFramework/Http/Dispatcher.php
@@ -64,7 +64,8 @@ class Dispatcher {
* @param LoggerInterface $logger
* @param IEventLogger $eventLogger
*/
- public function __construct(Http $protocol,
+ public function __construct(
+ Http $protocol,
MiddlewareDispatcher $middlewareDispatcher,
ControllerMethodReflector $reflector,
IRequest $request,
@@ -72,7 +73,8 @@ public function __construct(Http $protocol,
ConnectionAdapter $connection,
LoggerInterface $logger,
IEventLogger $eventLogger,
- ContainerInterface $appContainer) {
+ ContainerInterface $appContainer,
+ ) {
$this->protocol = $protocol;
$this->middlewareDispatcher = $middlewareDispatcher;
$this->reflector = $reflector;
diff --git a/lib/private/AppFramework/Http/Output.php b/lib/private/AppFramework/Http/Output.php
index ff0ef1c15cacc..b4a8672fdc75c 100644
--- a/lib/private/AppFramework/Http/Output.php
+++ b/lib/private/AppFramework/Http/Output.php
@@ -13,14 +13,9 @@
* Very thin wrapper class to make output testable
*/
class Output implements IOutput {
- /** @var string */
- private $webRoot;
-
- /**
- * @param $webRoot
- */
- public function __construct($webRoot) {
- $this->webRoot = $webRoot;
+ public function __construct(
+ private string $webRoot,
+ ) {
}
/**
diff --git a/lib/private/AppFramework/Middleware/Security/SameSiteCookieMiddleware.php b/lib/private/AppFramework/Middleware/Security/SameSiteCookieMiddleware.php
index ed3bb23202328..097ed1b2b8f01 100644
--- a/lib/private/AppFramework/Middleware/Security/SameSiteCookieMiddleware.php
+++ b/lib/private/AppFramework/Middleware/Security/SameSiteCookieMiddleware.php
@@ -14,16 +14,10 @@
use OCP\AppFramework\Middleware;
class SameSiteCookieMiddleware extends Middleware {
- /** @var Request */
- private $request;
-
- /** @var ControllerMethodReflector */
- private $reflector;
-
- public function __construct(Request $request,
- ControllerMethodReflector $reflector) {
- $this->request = $request;
- $this->reflector = $reflector;
+ public function __construct(
+ private Request $request,
+ private ControllerMethodReflector $reflector,
+ ) {
}
public function beforeController($controller, $methodName) {
@@ -59,7 +53,7 @@ public function afterException($controller, $methodName, \Exception $exception)
throw $exception;
}
- protected function setSameSiteCookie() {
+ protected function setSameSiteCookie(): void {
$cookieParams = $this->request->getCookieParams();
$secureCookie = ($cookieParams['secure'] === true) ? 'secure; ' : '';
$policies = [
diff --git a/lib/private/AppFramework/Utility/SimpleContainer.php b/lib/private/AppFramework/Utility/SimpleContainer.php
index 1d77c277b02c3..ed26e75ec89cb 100644
--- a/lib/private/AppFramework/Utility/SimpleContainer.php
+++ b/lib/private/AppFramework/Utility/SimpleContainer.php
@@ -14,6 +14,7 @@
use Pimple\Container;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
+use Psr\Log\LoggerInterface;
use ReflectionClass;
use ReflectionException;
use ReflectionNamedType;
@@ -185,8 +186,21 @@ public function registerService($name, Closure $closure, $shared = true) {
* @param string $alias the alias that should be registered
* @param string $target the target that should be resolved instead
*/
- public function registerAlias($alias, $target) {
- $this->registerService($alias, function (ContainerInterface $container) use ($target) {
+ public function registerAlias($alias, $target): void {
+ $this->registerService($alias, function (ContainerInterface $container) use ($target): mixed {
+ return $container->get($target);
+ }, false);
+ }
+
+ protected function registerDeprecatedAlias(string $alias, string $target): void {
+ $this->registerService($alias, function (ContainerInterface $container) use ($target, $alias): mixed {
+ try {
+ $logger = $container->get(LoggerInterface::class);
+ $logger->debug('The requested alias "' . $alias . '" is deprecated. Please request "' . $target . '" directly. This alias will be removed in a future Nextcloud version.', ['app' => 'serverDI']);
+ } catch (ContainerExceptionInterface $e) {
+ // Could not get logger. Continue
+ }
+
return $container->get($target);
}, false);
}
diff --git a/lib/private/EventDispatcher/EventDispatcher.php b/lib/private/EventDispatcher/EventDispatcher.php
index b7554c439ea28..474c902013bcc 100644
--- a/lib/private/EventDispatcher/EventDispatcher.php
+++ b/lib/private/EventDispatcher/EventDispatcher.php
@@ -14,7 +14,7 @@
use OCP\EventDispatcher\ABroadcastedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
-use OCP\IServerContainer;
+use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcher as SymfonyDispatcher;
use function get_class;
@@ -22,7 +22,7 @@
class EventDispatcher implements IEventDispatcher {
public function __construct(
private SymfonyDispatcher $dispatcher,
- private IServerContainer $container,
+ private ContainerInterface $container,
private LoggerInterface $logger,
) {
// inject the event dispatcher into the logger
diff --git a/lib/private/EventDispatcher/ServiceEventListener.php b/lib/private/EventDispatcher/ServiceEventListener.php
index 03a986ec78c4a..f9cc85b412605 100644
--- a/lib/private/EventDispatcher/ServiceEventListener.php
+++ b/lib/private/EventDispatcher/ServiceEventListener.php
@@ -12,7 +12,7 @@
use OCP\AppFramework\QueryException;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
-use OCP\IServerContainer;
+use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
use function sprintf;
@@ -23,24 +23,13 @@
* created by the service container
*/
final class ServiceEventListener {
- /** @var IServerContainer */
- private $container;
+ private ?IEventListener $service = null;
- /** @var string */
- private $class;
-
- /** @var LoggerInterface */
- private $logger;
-
- /** @var null|IEventListener */
- private $service;
-
- public function __construct(IServerContainer $container,
- string $class,
- LoggerInterface $logger) {
- $this->container = $container;
- $this->class = $class;
- $this->logger = $logger;
+ public function __construct(
+ private ContainerInterface $container,
+ private string $class,
+ private LoggerInterface $logger,
+ ) {
}
public function __invoke(Event $event) {
@@ -49,7 +38,7 @@ public function __invoke(Event $event) {
// TODO: fetch from the app containers, otherwise any custom services,
// parameters and aliases won't be resolved.
// See https://github.com/nextcloud/server/issues/27793 for details.
- $this->service = $this->container->query($this->class);
+ $this->service = $this->container->get($this->class);
} catch (QueryException $e) {
$this->logger->error(
sprintf(
diff --git a/lib/private/Server.php b/lib/private/Server.php
index c78decd90cb70..4b88a446405a5 100644
--- a/lib/private/Server.php
+++ b/lib/private/Server.php
@@ -238,7 +238,6 @@
use OCP\User\Events\UserLoggedInWithCookieEvent;
use OCP\User\Events\UserLoggedOutEvent;
use OCP\User\IAvailabilityCoordinator;
-use Psr\Container\ContainerExceptionInterface;
use Psr\Container\ContainerInterface;
use Psr\Log\LoggerInterface;
@@ -268,9 +267,7 @@ public function __construct($webRoot, \OC\Config $config) {
$this->registerService(ContainerInterface::class, function (ContainerInterface $c) {
return $c;
});
- $this->registerService(\OCP\IServerContainer::class, function (ContainerInterface $c) {
- return $c;
- });
+ $this->registerDeprecatedAlias(\OCP\IServerContainer::class, ContainerInterface::class);
$this->registerAlias(\OCP\Calendar\IManager::class, \OC\Calendar\Manager::class);
@@ -874,7 +871,7 @@ public function __construct($webRoot, \OC\Config $config) {
$c->get(IMimeTypeDetector::class)
);
});
- $this->registerService(\OCP\IRequest::class, function (ContainerInterface $c) {
+ $this->registerService(Request::class, function (ContainerInterface $c) {
if (isset($this['urlParams'])) {
$urlParams = $this['urlParams'];
} else {
@@ -908,6 +905,7 @@ public function __construct($webRoot, \OC\Config $config) {
$stream
);
});
+ $this->registerAlias(\OCP\IRequest::class, Request::class);
$this->registerService(IRequestId::class, function (ContainerInterface $c): IRequestId {
return new RequestId(
@@ -1682,7 +1680,6 @@ public function getSettingsManager() {
* @deprecated 20.0.0 Use get(\OCP\Files\AppData\IAppDataFactory::class)->get($app) instead
*/
public function getAppDataDir($app) {
- /** @var \OC\Files\AppData\Factory $factory */
$factory = $this->get(\OC\Files\AppData\Factory::class);
return $factory->get($app);
}
@@ -1694,18 +1691,4 @@ public function getAppDataDir($app) {
public function getCloudIdManager() {
return $this->get(ICloudIdManager::class);
}
-
- private function registerDeprecatedAlias(string $alias, string $target) {
- $this->registerService($alias, function (ContainerInterface $container) use ($target, $alias) {
- try {
- /** @var LoggerInterface $logger */
- $logger = $container->get(LoggerInterface::class);
- $logger->debug('The requested alias "' . $alias . '" is deprecated. Please request "' . $target . '" directly. This alias will be removed in a future Nextcloud version.', ['app' => 'serverDI']);
- } catch (ContainerExceptionInterface $e) {
- // Could not get logger. Continue
- }
-
- return $container->get($target);
- }, false);
- }
}
diff --git a/lib/private/Support/CrashReport/Registry.php b/lib/private/Support/CrashReport/Registry.php
index 77dd816317419..4fbbb8448caaa 100644
--- a/lib/private/Support/CrashReport/Registry.php
+++ b/lib/private/Support/CrashReport/Registry.php
@@ -6,11 +6,12 @@
* SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
+
namespace OC\Support\CrashReport;
use Exception;
use OCP\AppFramework\QueryException;
-use OCP\IServerContainer;
+use OCP\Server;
use OCP\Support\CrashReport\ICollectBreadcrumbs;
use OCP\Support\CrashReport\IMessageReporter;
use OCP\Support\CrashReport\IRegistry;
@@ -26,17 +27,8 @@ class Registry implements IRegistry {
/** @var IReporter[] */
private $reporters = [];
- /** @var IServerContainer */
- private $serverContainer;
-
- public function __construct(IServerContainer $serverContainer) {
- $this->serverContainer = $serverContainer;
- }
-
/**
* Register a reporter instance
- *
- * @param IReporter $reporter
*/
public function register(IReporter $reporter): void {
$this->reporters[] = $reporter;
@@ -49,10 +41,6 @@ public function registerLazy(string $class): void {
/**
* Delegate breadcrumb collection to all registered reporters
*
- * @param string $message
- * @param string $category
- * @param array $context
- *
* @since 15.0.0
*/
public function delegateBreadcrumb(string $message, string $category, array $context = []): void {
@@ -69,7 +57,6 @@ public function delegateBreadcrumb(string $message, string $category, array $con
* Delegate crash reporting to all registered reporters
*
* @param Exception|Throwable $exception
- * @param array $context
*/
public function delegateReport($exception, array $context = []): void {
$this->loadLazyProviders();
@@ -82,9 +69,6 @@ public function delegateReport($exception, array $context = []): void {
/**
* Delegate a message to all reporters that implement IMessageReporter
*
- * @param string $message
- * @param array $context
- *
* @return void
*/
public function delegateMessage(string $message, array $context = []): void {
@@ -101,13 +85,13 @@ private function loadLazyProviders(): void {
while (($class = array_shift($this->lazyReporters)) !== null) {
try {
/** @var IReporter $reporter */
- $reporter = $this->serverContainer->query($class);
+ $reporter = Server::get($class);
} catch (QueryException $e) {
/*
* There is a circular dependency between the logger and the registry, so
* we can not inject it. Thus the static call.
*/
- \OC::$server->get(LoggerInterface::class)->critical('Could not load lazy crash reporter: ' . $e->getMessage(), [
+ Server::get(LoggerInterface::class)->critical('Could not load lazy crash reporter: ' . $e->getMessage(), [
'exception' => $e,
]);
return;
@@ -123,7 +107,7 @@ private function loadLazyProviders(): void {
* There is a circular dependency between the logger and the registry, so
* we can not inject it. Thus the static call.
*/
- \OC::$server->get(LoggerInterface::class)->critical('Could not register lazy crash reporter: ' . $e->getMessage(), [
+ Server::get(LoggerInterface::class)->critical('Could not register lazy crash reporter: ' . $e->getMessage(), [
'exception' => $e,
]);
}
diff --git a/tests/lib/AppFramework/AppTest.php b/tests/lib/AppFramework/AppTest.php
index c43cd8e3c5420..f9b7cf5067567 100644
--- a/tests/lib/AppFramework/AppTest.php
+++ b/tests/lib/AppFramework/AppTest.php
@@ -29,7 +29,7 @@ function rrmdir($directory) {
class AppTest extends \Test\TestCase {
- private $container;
+ private DIContainer $container;
private $io;
private $api;
private $controller;
@@ -55,8 +55,8 @@ protected function setUp(): void {
$this->controllerMethod = 'method';
$this->container[$this->controllerName] = $this->controller;
- $this->container['Dispatcher'] = $this->dispatcher;
- $this->container['OCP\\AppFramework\\Http\\IOutput'] = $this->io;
+ $this->container[Dispatcher::class] = $this->dispatcher;
+ $this->container[IOutput::class] = $this->io;
$this->container['urlParams'] = ['_route' => 'not-profiler'];
$this->appPath = __DIR__ . '/../../../apps/namespacetestapp';
@@ -165,7 +165,7 @@ public function testCallbackIsCalled(): void {
}
public function testCoreApp(): void {
- $this->container['AppName'] = 'core';
+ $this->container['appName'] = 'core';
$this->container['OC\Core\Controller\Foo'] = $this->controller;
$this->container['urlParams'] = ['_route' => 'not-profiler'];
@@ -183,7 +183,7 @@ public function testCoreApp(): void {
}
public function testSettingsApp(): void {
- $this->container['AppName'] = 'settings';
+ $this->container['appName'] = 'settings';
$this->container['OCA\Settings\Controller\Foo'] = $this->controller;
$this->container['urlParams'] = ['_route' => 'not-profiler'];
@@ -201,7 +201,7 @@ public function testSettingsApp(): void {
}
public function testApp(): void {
- $this->container['AppName'] = 'bar';
+ $this->container['appName'] = 'bar';
$this->container['OCA\Bar\Controller\Foo'] = $this->controller;
$this->container['urlParams'] = ['_route' => 'not-profiler'];
diff --git a/tests/lib/AppFramework/DependencyInjection/DIContainerTest.php b/tests/lib/AppFramework/DependencyInjection/DIContainerTest.php
index e84b44db9a0f1..31188b12f145d 100644
--- a/tests/lib/AppFramework/DependencyInjection/DIContainerTest.php
+++ b/tests/lib/AppFramework/DependencyInjection/DIContainerTest.php
@@ -18,13 +18,13 @@
use OCP\AppFramework\QueryException;
use OCP\IConfig;
use OCP\IRequestId;
+use PHPUnit\Framework\MockObject\MockObject;
/**
* @group DB
*/
class DIContainerTest extends \Test\TestCase {
- /** @var DIContainer|\PHPUnit\Framework\MockObject\MockObject */
- private $container;
+ private DIContainer&MockObject $container;
protected function setUp(): void {
parent::setUp();
@@ -45,11 +45,13 @@ public function testProvidesMiddlewareDispatcher(): void {
public function testProvidesAppName(): void {
$this->assertTrue(isset($this->container['AppName']));
+ $this->assertTrue(isset($this->container['appName']));
}
public function testAppNameIsSetCorrectly(): void {
$this->assertEquals('name', $this->container['AppName']);
+ $this->assertEquals('name', $this->container['appName']);
}
public function testMiddlewareDispatcherIncludesSecurityMiddleware(): void {
diff --git a/tests/lib/Support/CrashReport/RegistryTest.php b/tests/lib/Support/CrashReport/RegistryTest.php
index b65c21b759e12..adf7579b202c9 100644
--- a/tests/lib/Support/CrashReport/RegistryTest.php
+++ b/tests/lib/Support/CrashReport/RegistryTest.php
@@ -12,27 +12,18 @@
use Exception;
use OC\Support\CrashReport\Registry;
use OCP\AppFramework\QueryException;
-use OCP\IServerContainer;
use OCP\Support\CrashReport\ICollectBreadcrumbs;
use OCP\Support\CrashReport\IMessageReporter;
use OCP\Support\CrashReport\IReporter;
use Test\TestCase;
class RegistryTest extends TestCase {
- /** @var IServerContainer|\PHPUnit\Framework\MockObject\MockObject */
- private $serverContainer;
-
- /** @var Registry */
- private $registry;
+ private Registry $registry;
protected function setUp(): void {
parent::setUp();
- $this->serverContainer = $this->createMock(IServerContainer::class);
-
- $this->registry = new Registry(
- $this->serverContainer
- );
+ $this->registry = new Registry();
}
/**
@@ -45,13 +36,10 @@ public function testDelegateToNone(): void {
$this->addToAssertionCount(1);
}
- public function testRegisterLazyCantLoad(): void {
+ public function testRegisterLazy(): void {
$reporterClass = '\OCA\MyApp\Reporter';
$reporter = $this->createMock(IReporter::class);
- $this->serverContainer->expects($this->once())
- ->method('query')
- ->with($reporterClass)
- ->willReturn($reporter);
+ $this->overwriteService($reporterClass, $reporter);
$reporter->expects($this->once())
->method('report');
$exception = new Exception('test');
@@ -60,16 +48,17 @@ public function testRegisterLazyCantLoad(): void {
$this->registry->delegateReport($exception);
}
- public function testRegisterLazy(): void {
+ /**
+ * Doesn't assert anything, just checks whether anything "explodes"
+ */
+ public function testRegisterLazyCantLoad(): void {
$reporterClass = '\OCA\MyApp\Reporter';
- $this->serverContainer->expects($this->once())
- ->method('query')
- ->with($reporterClass)
- ->willThrowException(new QueryException());
+ /* We do not register reporterClass in DI, so it will throw a QueryException queried */
$exception = new Exception('test');
$this->registry->registerLazy($reporterClass);
$this->registry->delegateReport($exception);
+ $this->addToAssertionCount(1);
}
public function testDelegateBreadcrumbCollection(): void {
diff --git a/tests/lib/TestCase.php b/tests/lib/TestCase.php
index e91e847e85905..cdeefde748c49 100644
--- a/tests/lib/TestCase.php
+++ b/tests/lib/TestCase.php
@@ -21,6 +21,7 @@
use OC\Files\SetupManager;
use OC\Files\View;
use OC\Template\Base;
+use OCP\AppFramework\QueryException;
use OCP\Command\IBus;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\Defaults;
@@ -91,7 +92,11 @@ public function overwriteService(string $name, $newService): bool {
return false;
}
- $this->services[$name] = Server::get($name);
+ try {
+ $this->services[$name] = Server::get($name);
+ } catch (QueryException $e) {
+ $this->services[$name] = false;
+ }
$container = \OC::$server->getAppContainerForService($name);
$container = $container ?? \OC::$server;
@@ -113,9 +118,13 @@ public function restoreService(string $name): bool {
$container = \OC::$server->getAppContainerForService($name);
$container = $container ?? \OC::$server;
- $container->registerService($name, function () use ($oldService) {
- return $oldService;
- });
+ if ($oldService !== false) {
+ $container->registerService($name, function () use ($oldService) {
+ return $oldService;
+ });
+ } else {
+ unset($container[$oldService]);
+ }
unset($this->services[$name]);