From 9913bdda90fd108fff32dac6430826f8af4a78c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=B4me=20Chilliet?= Date: Mon, 16 Jun 2025 18:00:28 +0200 Subject: [PATCH] chore: Cleanup DIContainer class MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also removed deprecated tag from the class as this class will not be removed, only the interface IAppContainer and associated methods should be removed. Signed-off-by: Côme Chilliet --- .../tests/AppInfo/ApplicationTest.php | 2 +- lib/private/AppFramework/App.php | 4 +- .../DependencyInjection/DIContainer.php | 188 +++++------------- lib/private/AppFramework/Http/Dispatcher.php | 6 +- lib/private/AppFramework/Http/Output.php | 11 +- .../AppFramework/Utility/SimpleContainer.php | 18 +- lib/private/Server.php | 20 +- 7 files changed, 81 insertions(+), 168 deletions(-) diff --git a/apps/settings/tests/AppInfo/ApplicationTest.php b/apps/settings/tests/AppInfo/ApplicationTest.php index b09412d8387..3e895d87b06 100644 --- a/apps/settings/tests/AppInfo/ApplicationTest.php +++ b/apps/settings/tests/AppInfo/ApplicationTest.php @@ -39,7 +39,7 @@ class ApplicationTest extends TestCase { 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/lib/private/AppFramework/App.php b/lib/private/AppFramework/App.php index c5f61d7e938..e719ea19f90 100644 --- a/lib/private/AppFramework/App.php +++ b/lib/private/AppFramework/App.php @@ -101,7 +101,7 @@ class App { $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 @@ class App { $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 87361a9d1ea..4d802b5c297 100644 --- a/lib/private/AppFramework/DependencyInjection/DIContainer.php +++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php @@ -1,10 +1,13 @@ 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 +72,66 @@ class DIContainer extends SimpleContainer implements IAppContainer { // 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(\OCP\Files\AppData\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) { - return new ScopedPsrLogger( - $c->get(PsrLoggerAdapter::class), - $c->get('AppName') - ); - }); + $this->registerAlias(LoggerInterface::class, ScopedPsrLogger::class); $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->registerDeprecatedAlias(IAppContainer::class, ContainerInterface::class); // commonly used attributes - $this->registerService('userId', function (ContainerInterface $c) { + $this->registerService('userId', function (ContainerInterface $c): string { return $c->get(IUserSession::class)->getSession()->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,7 +155,8 @@ class DIContainer extends SimpleContainer implements IAppContainer { /** * 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(); @@ -198,24 +173,13 @@ class DIContainer extends SimpleContainer implements IAppContainer { ); $dispatcher->registerMiddleware( - new OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware( - $c->get(IRequest::class), - $c->get(IControllerMethodReflector::class) - ) + $c->get(OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware::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) - ) + $c->get(CORSMiddleware::class) ); $dispatcher->registerMiddleware( - new OCSMiddleware( - $c->get(IRequest::class) - ) + $c->get(OCSMiddleware::class) ); $dispatcher->registerMiddleware($c->get(FlowV2EphemeralSessionsMiddleware::class)); @@ -225,75 +189,45 @@ class DIContainer extends SimpleContainer implements IAppContainer { $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), - ) + $c->get(OC\AppFramework\Middleware\Security\CSPMiddleware::class) ); $dispatcher->registerMiddleware( - $server->query(OC\AppFramework\Middleware\Security\FeaturePolicyMiddleware::class) + $c->get(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), - ) + $c->get(OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware::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) - ) + $c->get(TwoFactorMiddleware::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) - ) + $c->get(OC\AppFramework\Middleware\Security\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) - ) + $c->get(OC\AppFramework\Middleware\PublicShare\PublicShareMiddleware::class) ); $dispatcher->registerMiddleware( $c->get(\OC\AppFramework\Middleware\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()) { @@ -306,27 +240,13 @@ class DIContainer extends SimpleContainer implements IAppContainer { } $dispatcher->registerMiddleware( - new SessionMiddleware( - $c->get(IControllerMethodReflector::class), - $c->get(ISession::class) - ) + $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 +258,13 @@ class DIContainer extends SimpleContainer implements IAppContainer { /** * @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 +272,7 @@ class DIContainer extends SimpleContainer implements IAppContainer { * @return string the name of your application */ public function getAppName() { - return $this->query('AppName'); + return $this->query('appName'); } /** @@ -372,7 +292,7 @@ class DIContainer extends SimpleContainer implements IAppContainer { return \OC_User::isAdminUser($uid); } - private function getUserId() { + private function getUserId(): string { return $this->getServer()->getSession()->get('user_id'); } diff --git a/lib/private/AppFramework/Http/Dispatcher.php b/lib/private/AppFramework/Http/Dispatcher.php index d129a7d770b..8d91ddf7502 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 @@ class Dispatcher { 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 ff0ef1c15ca..b4a8672fdc7 100644 --- a/lib/private/AppFramework/Http/Output.php +++ b/lib/private/AppFramework/Http/Output.php @@ -13,14 +13,9 @@ use OCP\AppFramework\Http\IOutput; * 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/Utility/SimpleContainer.php b/lib/private/AppFramework/Utility/SimpleContainer.php index 1d77c277b02..ed26e75ec89 100644 --- a/lib/private/AppFramework/Utility/SimpleContainer.php +++ b/lib/private/AppFramework/Utility/SimpleContainer.php @@ -14,6 +14,7 @@ use OCP\IContainer; 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 @@ class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer { * @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/Server.php b/lib/private/Server.php index c78decd90cb..b6dbdf62bdc 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -238,7 +238,6 @@ use OCP\User\Events\UserLoggedInEvent; 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 @@ class Server extends ServerContainer implements IServerContainer { $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); @@ -1682,7 +1679,6 @@ class Server extends ServerContainer implements IServerContainer { * @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 +1690,4 @@ class Server extends ServerContainer implements IServerContainer { 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); - } }