From 4152216bd8cf9d49e6749d26bb8b491dd49b089b Mon Sep 17 00:00:00 2001 From: Christoph Wurst Date: Mon, 13 Jul 2020 11:18:14 +0200 Subject: [PATCH] Use PSR container interface and deprecate our own abstraction Signed-off-by: Christoph Wurst --- 3rdparty | 2 +- .../DependencyInjection/DIContainer.php | 172 ++++++++++-------- .../AppFramework/Utility/SimpleContainer.php | 137 +++++++++----- lib/private/Server.php | 18 +- lib/private/ServerContainer.php | 31 +++- .../AppFramework/Bootstrap/IBootContext.php | 7 +- lib/public/AppFramework/IAppContainer.php | 5 + lib/public/AppFramework/QueryException.php | 9 +- lib/public/IContainer.php | 12 +- lib/public/IServerContainer.php | 1 + 10 files changed, 249 insertions(+), 145 deletions(-) diff --git a/3rdparty b/3rdparty index 8460f552fb..10acc20198 160000 --- a/3rdparty +++ b/3rdparty @@ -1 +1 @@ -Subproject commit 8460f552fbf8ee468734225fa6a890cde4beb964 +Subproject commit 10acc20198442f3c04bc1abbf9ad540a3afbab40 diff --git a/lib/private/AppFramework/DependencyInjection/DIContainer.php b/lib/private/AppFramework/DependencyInjection/DIContainer.php index bda014838e..d45c90a720 100644 --- a/lib/private/AppFramework/DependencyInjection/DIContainer.php +++ b/lib/private/AppFramework/DependencyInjection/DIContainer.php @@ -69,7 +69,11 @@ use OCP\IServerContainer; use OCP\ISession; use OCP\IURLGenerator; use OCP\IUserSession; +use Psr\Container\ContainerInterface; +/** + * @deprecated 20.0.0 + */ class DIContainer extends SimpleContainer implements IAppContainer { /** @@ -116,17 +120,17 @@ class DIContainer extends SimpleContainer implements IAppContainer { return $this->getServer()->getUserFolder(); }); - $this->registerService(IAppData::class, function (SimpleContainer $c) { - return $this->getServer()->getAppDataDir($c->query('AppName')); + $this->registerService(IAppData::class, function (ContainerInterface $c) { + return $this->getServer()->getAppDataDir($c->get('AppName')); }); - $this->registerService(IL10N::class, function ($c) { - return $this->getServer()->getL10N($c->query('AppName')); + $this->registerService(IL10N::class, function (ContainerInterface $c) { + return $this->getServer()->getL10N($c->get('AppName')); }); // Log wrapper - $this->registerService(ILogger::class, function ($c) { - return new OC\AppFramework\Logger($this->server->query(ILogger::class), $c->query('AppName')); + $this->registerService(ILogger::class, function (ContainerInterface $c) { + return new OC\AppFramework\Logger($this->server->query(ILogger::class), $c->get('AppName')); }); $this->registerService(IServerContainer::class, function () { @@ -134,40 +138,41 @@ class DIContainer extends SimpleContainer implements IAppContainer { }); $this->registerAlias('ServerContainer', IServerContainer::class); - $this->registerService(\OCP\WorkflowEngine\IManager::class, function ($c) { - return $c->query(Manager::class); + $this->registerService(\OCP\WorkflowEngine\IManager::class, function (ContainerInterface $c) { + return $c->get(Manager::class); }); - $this->registerService(\OCP\AppFramework\IAppContainer::class, function ($c) { + $this->registerService(ContainerInterface::class, function (ContainerInterface $c) { return $c; }); + $this->registerAlias(IAppContainer::class, ContainerInterface::class); // commonly used attributes - $this->registerService('UserId', function ($c) { - return $c->query(IUserSession::class)->getSession()->get('user_id'); + $this->registerService('UserId', function (ContainerInterface $c) { + return $c->get(IUserSession::class)->getSession()->get('user_id'); }); - $this->registerService('WebRoot', function ($c) { - return $c->query('ServerContainer')->getWebRoot(); + $this->registerService('WebRoot', function (ContainerInterface $c) { + return $c->get(IServerContainer::class)->getWebRoot(); }); - $this->registerService('OC_Defaults', function ($c) { - return $c->getServer()->getThemingDefaults(); + $this->registerService('OC_Defaults', function (ContainerInterface $c) { + return $c->get(IServerContainer::class)->getThemingDefaults(); }); - $this->registerService('Protocol', function ($c) { + $this->registerService('Protocol', function (ContainerInterface $c) { /** @var \OC\Server $server */ - $server = $c->query('ServerContainer'); + $server = $c->get(IServerContainer::class); $protocol = $server->getRequest()->getHttpProtocol(); return new Http($_SERVER, $protocol); }); - $this->registerService('Dispatcher', function ($c) { + $this->registerService('Dispatcher', function (ContainerInterface $c) { return new Dispatcher( - $c['Protocol'], - $c['MiddlewareDispatcher'], - $c->query(IControllerMethodReflector::class), - $c['Request'] + $c->get('Protocol'), + $c->get(MiddlewareDispatcher::class), + $c->get(IControllerMethodReflector::class), + $c->get(IRequest::class) ); }); @@ -181,48 +186,49 @@ class DIContainer extends SimpleContainer implements IAppContainer { /** * Middleware */ - $this->registerService('MiddlewareDispatcher', function (SimpleContainer $c) { - $server = $this->getServer(); + $this->registerAlias('MiddlewareDispatcher', MiddlewareDispatcher::class); + $this->registerService(MiddlewareDispatcher::class, function (ContainerInterface $c) { + $server = $this->getServer(); $dispatcher = new MiddlewareDispatcher(); $dispatcher->registerMiddleware( - $c->query(OC\AppFramework\Middleware\CompressionMiddleware::class) + $c->get(OC\AppFramework\Middleware\CompressionMiddleware::class) ); - $dispatcher->registerMiddleware($c->query(OC\AppFramework\Middleware\NotModifiedMiddleware::class)); + $dispatcher->registerMiddleware($c->get(OC\AppFramework\Middleware\NotModifiedMiddleware::class)); $dispatcher->registerMiddleware( - $c->query(OC\AppFramework\Middleware\Security\ReloadExecutionMiddleware::class) + $c->get(OC\AppFramework\Middleware\Security\ReloadExecutionMiddleware::class) ); $dispatcher->registerMiddleware( new OC\AppFramework\Middleware\Security\SameSiteCookieMiddleware( - $c->query(IRequest::class), - $c->query(IControllerMethodReflector::class) + $c->get(IRequest::class), + $c->get(IControllerMethodReflector::class) ) ); $dispatcher->registerMiddleware( new CORSMiddleware( - $c->query(IRequest::class), - $c->query(IControllerMethodReflector::class), - $c->query(IUserSession::class), - $c->query(OC\Security\Bruteforce\Throttler::class) + $c->get(IRequest::class), + $c->get(IControllerMethodReflector::class), + $c->get(IUserSession::class), + $c->get(OC\Security\Bruteforce\Throttler::class) ) ); $dispatcher->registerMiddleware( new OCSMiddleware( - $c->query(IRequest::class) + $c->get(IRequest::class) ) ); $securityMiddleware = new SecurityMiddleware( - $c->query(IRequest::class), - $c->query(IControllerMethodReflector::class), - $c->query(INavigationManager::class), - $c->query(IURLGenerator::class), - $server->getLogger(), - $c['AppName'], + $c->get(IRequest::class), + $c->get(IControllerMethodReflector::class), + $c->get(INavigationManager::class), + $c->get(IURLGenerator::class), + $server->query(ILogger::class), + $c->get('AppName'), $server->getUserSession()->isLoggedIn(), $server->getGroupManager()->isAdmin($this->getUserId()), $server->getUserSession()->getUser() !== null && $server->query(ISubAdmin::class)->isSubAdmin($server->getUserSession()->getUser()), @@ -242,71 +248,71 @@ class DIContainer extends SimpleContainer implements IAppContainer { ); $dispatcher->registerMiddleware( new OC\AppFramework\Middleware\Security\PasswordConfirmationMiddleware( - $c->query(IControllerMethodReflector::class), - $c->query(ISession::class), - $c->query(IUserSession::class), - $c->query(ITimeFactory::class) + $c->get(IControllerMethodReflector::class), + $c->get(ISession::class), + $c->get(IUserSession::class), + $c->get(ITimeFactory::class) ) ); $dispatcher->registerMiddleware( new TwoFactorMiddleware( - $c->query(OC\Authentication\TwoFactorAuth\Manager::class), - $c->query(IUserSession::class), - $c->query(ISession::class), - $c->query(IURLGenerator::class), - $c->query(IControllerMethodReflector::class), - $c->query(IRequest::class) + $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->query(IControllerMethodReflector::class), - $c->query(OC\Security\Bruteforce\Throttler::class), - $c->query(IRequest::class) + $c->get(IControllerMethodReflector::class), + $c->get(OC\Security\Bruteforce\Throttler::class), + $c->get(IRequest::class) ) ); $dispatcher->registerMiddleware( new RateLimitingMiddleware( - $c->query(IRequest::class), - $c->query(IUserSession::class), - $c->query(IControllerMethodReflector::class), - $c->query(OC\Security\RateLimiting\Limiter::class) + $c->get(IRequest::class), + $c->get(IUserSession::class), + $c->get(IControllerMethodReflector::class), + $c->get(OC\Security\RateLimiting\Limiter::class) ) ); $dispatcher->registerMiddleware( new OC\AppFramework\Middleware\PublicShare\PublicShareMiddleware( - $c->query(IRequest::class), - $c->query(ISession::class), - $c->query(\OCP\IConfig::class) + $c->get(IRequest::class), + $c->get(ISession::class), + $c->get(\OCP\IConfig::class) ) ); $dispatcher->registerMiddleware( - $c->query(\OC\AppFramework\Middleware\AdditionalScriptsMiddleware::class) + $c->get(\OC\AppFramework\Middleware\AdditionalScriptsMiddleware::class) ); foreach ($this->middleWares as $middleWare) { - $dispatcher->registerMiddleware($c->query($middleWare)); + $dispatcher->registerMiddleware($c->get($middleWare)); } $dispatcher->registerMiddleware( new SessionMiddleware( - $c->query(IControllerMethodReflector::class), - $c->query(ISession::class) + $c->get(IControllerMethodReflector::class), + $c->get(ISession::class) ) ); return $dispatcher; }); - $this->registerService(IAppConfig::class, function (SimpleContainer $c) { + $this->registerService(IAppConfig::class, function (ContainerInterface $c) { return new OC\AppFramework\Services\AppConfig( - $c->query(IConfig::class), - $c->query('AppName') + $c->get(IConfig::class), + $c->get('AppName') ); }); - $this->registerService(IInitialState::class, function (SimpleContainer $c) { + $this->registerService(IInitialState::class, function (ContainerInterface $c) { return new OC\AppFramework\Services\InitialState( - $c->query(IInitialStateService::class), - $c->query('AppName') + $c->get(IInitialStateService::class), + $c->get('AppName') ); }); } @@ -396,6 +402,18 @@ class DIContainer extends SimpleContainer implements IAppContainer { }); } + public function has($id): bool { + if (parent::has($id)) { + return true; + } + + if ($this->server->has($id, true)) { + return true; + } + + return false; + } + public function query(string $name, bool $autoload = true) { try { return $this->queryNoFallback($name); @@ -421,14 +439,12 @@ class DIContainer extends SimpleContainer implements IAppContainer { if ($this->offsetExists($name)) { return parent::query($name); - } else { - if ($this['AppName'] === 'settings' && strpos($name, 'OC\\Settings\\') === 0) { - return parent::query($name); - } elseif ($this['AppName'] === 'core' && strpos($name, 'OC\\Core\\') === 0) { - return parent::query($name); - } elseif (strpos($name, \OC\AppFramework\App::buildAppNamespace($this['AppName']) . '\\') === 0) { - return parent::query($name); - } + } elseif ($this['AppName'] === 'settings' && strpos($name, 'OC\\Settings\\') === 0) { + return parent::query($name); + } elseif ($this['AppName'] === 'core' && strpos($name, 'OC\\Core\\') === 0) { + return parent::query($name); + } elseif (strpos($name, \OC\AppFramework\App::buildAppNamespace($this['AppName']) . '\\') === 0) { + return parent::query($name); } throw new QueryException('Could not resolve ' . $name . '!' . diff --git a/lib/private/AppFramework/Utility/SimpleContainer.php b/lib/private/AppFramework/Utility/SimpleContainer.php index 60f674bbea..c17578183a 100644 --- a/lib/private/AppFramework/Utility/SimpleContainer.php +++ b/lib/private/AppFramework/Utility/SimpleContainer.php @@ -30,20 +30,37 @@ namespace OC\AppFramework\Utility; +use ArrayAccess; use Closure; use OCP\AppFramework\QueryException; use OCP\IContainer; use Pimple\Container; +use Psr\Container\ContainerInterface; use ReflectionClass; use ReflectionException; +use ReflectionParameter; +use function class_exists; /** - * Class SimpleContainer - * - * SimpleContainer is a simple implementation of IContainer on basis of Pimple + * SimpleContainer is a simple implementation of a container on basis of Pimple */ -class SimpleContainer extends Container implements IContainer { +class SimpleContainer implements ArrayAccess, ContainerInterface, IContainer { + /** @var Container */ + private $container; + + public function __construct() { + $this->container = new Container(); + } + + public function get($id) { + return $this->query($id); + } + + public function has($id): bool { + // If a service is no registered but is an existing class, we can probably load it + return isset($this->container[$id]) || class_exists($id); + } /** * @param ReflectionClass $class the class to instantiate @@ -54,45 +71,37 @@ class SimpleContainer extends Container implements IContainer { $constructor = $class->getConstructor(); if ($constructor === null) { return $class->newInstance(); - } else { - $parameters = []; - foreach ($constructor->getParameters() as $parameter) { - $parameterClass = $parameter->getClass(); - - // try to find out if it is a class or a simple parameter - if ($parameterClass === null) { - $resolveName = $parameter->getName(); - } else { - $resolveName = $parameterClass->name; - } - - try { - $builtIn = $parameter->hasType() && $parameter->getType()->isBuiltin(); - $parameters[] = $this->query($resolveName, !$builtIn); - } catch (QueryException $e) { - // Service not found, use the default value when available - if ($parameter->isDefaultValueAvailable()) { - $parameters[] = $parameter->getDefaultValue(); - } elseif ($parameterClass !== null) { - $resolveName = $parameter->getName(); - $parameters[] = $this->query($resolveName); - } else { - throw $e; - } - } - } - return $class->newInstanceArgs($parameters); } + + return $class->newInstanceArgs(array_map(function (ReflectionParameter $parameter) { + $parameterClass = $parameter->getClass(); + + // try to find out if it is a class or a simple parameter + if ($parameterClass === null) { + $resolveName = $parameter->getName(); + } else { + $resolveName = $parameterClass->name; + } + + try { + $builtIn = $parameter->hasType() && $parameter->getType()->isBuiltin(); + return $this->query($resolveName, !$builtIn); + } catch (QueryException $e) { + // Service not found, use the default value when available + if ($parameter->isDefaultValueAvailable()) { + return $parameter->getDefaultValue(); + } + + if ($parameterClass !== null) { + $resolveName = $parameter->getName(); + return $this->query($resolveName); + } + + throw $e; + } + }, $constructor->getParameters())); } - - /** - * If a parameter is not registered in the container try to instantiate it - * by using reflection to find out how to build the class - * @param string $name the class name to resolve - * @return \stdClass - * @throws QueryException if the class could not be found or instantiated - */ public function resolve($name) { $baseMsg = 'Could not resolve ' . $name . '!'; try { @@ -110,15 +119,18 @@ class SimpleContainer extends Container implements IContainer { public function query(string $name, bool $autoload = true) { $name = $this->sanitizeName($name); - if ($this->offsetExists($name)) { - return $this->offsetGet($name); - } elseif ($autoload) { + if (isset($this->container[$name])) { + return $this->container[$name]; + } + + if ($autoload) { $object = $this->resolve($name); $this->registerService($name, function () use ($object) { return $object; }); return $object; } + throw new QueryException('Could not resolve ' . $name . '!'); } @@ -140,14 +152,17 @@ class SimpleContainer extends Container implements IContainer { * @param bool $shared */ public function registerService($name, Closure $closure, $shared = true) { + $wrapped = function () use ($closure) { + return $closure($this); + }; $name = $this->sanitizeName($name); if (isset($this[$name])) { unset($this[$name]); } if ($shared) { - $this[$name] = $closure; + $this[$name] = $wrapped; } else { - $this[$name] = parent::factory($closure); + $this[$name] = $this->container->factory($wrapped); } } @@ -159,8 +174,8 @@ class SimpleContainer extends Container implements IContainer { * @param string $target the target that should be resolved instead */ public function registerAlias($alias, $target) { - $this->registerService($alias, function (IContainer $container) use ($target) { - return $container->query($target); + $this->registerService($alias, function (ContainerInterface $container) use ($target) { + return $container->get($target); }, false); } @@ -174,4 +189,32 @@ class SimpleContainer extends Container implements IContainer { } return $name; } + + /** + * @deprecated 20.0.0 use \Psr\Container\ContainerInterface::has + */ + public function offsetExists($id) { + return $this->container->offsetExists($id); + } + + /** + * @deprecated 20.0.0 use \Psr\Container\ContainerInterface::get + */ + public function offsetGet($id) { + return $this->container->offsetGet($id); + } + + /** + * @deprecated 20.0.0 use \OCP\IContainer::registerService + */ + public function offsetSet($id, $service) { + $this->container->offsetSet($id, $service); + } + + /** + * @deprecated 20.0.0 + */ + public function offsetUnset($offset) { + $this->container->offsetUnset($offset); + } } diff --git a/lib/private/Server.php b/lib/private/Server.php index 582718cd7c..5769953a9e 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -139,7 +139,6 @@ use OCA\Theming\ThemingDefaults; use OCA\Theming\Util; use OCP\Accounts\IAccountManager; use OCP\App\IAppManager; -use OCP\AppFramework\QueryException; use OCP\Authentication\LoginCredentials\IStore; use OCP\BackgroundJob\IJobList; use OCP\Collaboration\AutoComplete\IManager; @@ -178,7 +177,6 @@ use OCP\IAppConfig; use OCP\IAvatarManager; use OCP\ICache; use OCP\ICacheFactory; -use OCP\IContainer; use OCP\IDateTimeFormatter; use OCP\IDateTimeZone; use OCP\IDBConnection; @@ -226,6 +224,8 @@ use OCP\User\Events\UserDeletedEvent; use OCP\User\Events\UserLoggedInEvent; use OCP\User\Events\UserLoggedInWithCookieEvent; use OCP\User\Events\UserLoggedOutEvent; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; use Psr\Log\LoggerInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\GenericEvent; @@ -242,6 +242,7 @@ use OCA\Files_External\Service\BackendService; * TODO: hookup all manager classes */ class Server extends ServerContainer implements IServerContainer { + /** @var string */ private $webRoot; @@ -256,7 +257,10 @@ class Server extends ServerContainer implements IServerContainer { // To find out if we are running from CLI or not $this->registerParameter('isCLI', \OC::$CLI); - $this->registerService(\OCP\IServerContainer::class, function (IServerContainer $c) { + $this->registerService(ContainerInterface::class, function (ContainerInterface $c) { + return $c; + }); + $this->registerService(\OCP\IServerContainer::class, function (ContainerInterface $c) { return $c; }); @@ -2232,16 +2236,16 @@ class Server extends ServerContainer implements IServerContainer { } private function registerDeprecatedAlias(string $alias, string $target) { - $this->registerService($alias, function (IContainer $container) use ($target, $alias) { + $this->registerService($alias, function (ContainerInterface $container) use ($target, $alias) { try { /** @var ILogger $logger */ - $logger = $container->query(ILogger::class); + $logger = $container->get(ILogger::class); $logger->debug('The requested alias "' . $alias . '" is depreacted. Please request "' . $target . '" directly. This alias will be removed in a future Nextcloud version.', ['app' => 'serverDI']); - } catch (QueryException $e) { + } catch (ContainerExceptionInterface $e) { // Could not get logger. Continue } - return $container->query($target); + return $container->get($target); }, false); } } diff --git a/lib/private/ServerContainer.php b/lib/private/ServerContainer.php index effa57a3ab..eb6bda1e27 100644 --- a/lib/private/ServerContainer.php +++ b/lib/private/ServerContainer.php @@ -31,6 +31,8 @@ use OC\AppFramework\App; use OC\AppFramework\DependencyInjection\DIContainer; use OC\AppFramework\Utility\SimpleContainer; use OCP\AppFramework\QueryException; +use function explode; +use function strtolower; /** * Class ServerContainer @@ -117,19 +119,21 @@ class ServerContainer extends SimpleContainer { throw new QueryException(); } + public function has($id, bool $noRecursion = false): bool { + if (!$noRecursion && ($appContainer = $this->getAppContainerForService($id)) !== null) { + return $appContainer->has($id); + } + + return parent::has($id); + } + public function query(string $name, bool $autoload = true) { $name = $this->sanitizeName($name); - if (isset($this[$name])) { - return $this[$name]; - } - // In case the service starts with OCA\ we try to find the service in // the apps container first. - if (strpos($name, 'OCA\\') === 0 && substr_count($name, '\\') >= 2) { - $segments = explode('\\', $name); + if (($appContainer = $this->getAppContainerForService($name)) !== null) { try { - $appContainer = $this->getAppContainer(strtolower($segments[1]), $segments[1]); return $appContainer->queryNoFallback($name); } catch (QueryException $e) { // Didn't find the service or the respective app container, @@ -148,4 +152,17 @@ class ServerContainer extends SimpleContainer { return parent::query($name, $autoload); } + + private function getAppContainerForService(string $id): ?DIContainer { + if (strpos($id, 'OCA\\') !== 0 || substr_count($id, '\\') < 2) { + return null; + } + + try { + [,$namespace,] = explode('\\', $id); + return $this->getAppContainer(strtolower($namespace), $namespace); + } catch (QueryException $e) { + return null; + } + } } diff --git a/lib/public/AppFramework/Bootstrap/IBootContext.php b/lib/public/AppFramework/Bootstrap/IBootContext.php index 47b26528c6..ee0bef6a5f 100644 --- a/lib/public/AppFramework/Bootstrap/IBootContext.php +++ b/lib/public/AppFramework/Bootstrap/IBootContext.php @@ -26,8 +26,9 @@ declare(strict_types=1); namespace OCP\AppFramework\Bootstrap; use OCP\AppFramework\IAppContainer; -use OCP\AppFramework\QueryException; use OCP\IServerContainer; +use Psr\Container\ContainerExceptionInterface; +use Psr\Container\ContainerInterface; use Throwable; /** @@ -40,7 +41,7 @@ interface IBootContext { * * Useful to register and query app-specific services * - * @return IAppContainer + * @return IAppContainer|ContainerInterface * @since 20.0.0 */ public function getAppContainer(): IAppContainer; @@ -68,7 +69,7 @@ interface IBootContext { * Note: the app container will be queried * * @param callable $fn - * @throws QueryException if at least one of the parameter can't be resolved + * @throws ContainerExceptionInterface if at least one of the parameter can't be resolved * @throws Throwable any error the function invocation might cause * @return mixed|null the return value of the invoked function, if any * @since 20.0.0 diff --git a/lib/public/AppFramework/IAppContainer.php b/lib/public/AppFramework/IAppContainer.php index b749c9fd7a..2a3689e706 100644 --- a/lib/public/AppFramework/IAppContainer.php +++ b/lib/public/AppFramework/IAppContainer.php @@ -34,6 +34,7 @@ use OCP\IContainer; * * This container interface provides short cuts for app developers to access predefined app service. * @since 6.0.0 + * @deprecated 20.0.0 use \Psr\Container\ContainerInterface */ interface IAppContainer extends IContainer { @@ -41,12 +42,14 @@ interface IAppContainer extends IContainer { * used to return the appname of the set application * @return string the name of your application * @since 6.0.0 + * @deprecated 20.0.0 */ public function getAppName(); /** * @return \OCP\IServerContainer * @since 6.0.0 + * @deprecated 20.0.0 */ public function getServer(); @@ -54,6 +57,7 @@ interface IAppContainer extends IContainer { * @param string $middleWare * @return boolean * @since 6.0.0 + * @deprecated 20.0.0 use \OCP\AppFramework\Bootstrap\IRegistrationContext::registerMiddleware */ public function registerMiddleWare($middleWare); @@ -62,6 +66,7 @@ interface IAppContainer extends IContainer { * * @param string $serviceName e.g. 'OCA\Files\Capabilities' * @since 8.2.0 + * @deprecated 20.0.0 use \OCP\AppFramework\Bootstrap\IRegistrationContext::registerCapability */ public function registerCapability($serviceName); } diff --git a/lib/public/AppFramework/QueryException.php b/lib/public/AppFramework/QueryException.php index 1bb03b8f21..c4f401532b 100644 --- a/lib/public/AppFramework/QueryException.php +++ b/lib/public/AppFramework/QueryException.php @@ -1,4 +1,7 @@