diff --git a/wcfsetup/install/files/lib/action/ApiAction.class.php b/wcfsetup/install/files/lib/action/ApiAction.class.php index 6d0ad0ac54..81074e8c9c 100644 --- a/wcfsetup/install/files/lib/action/ApiAction.class.php +++ b/wcfsetup/install/files/lib/action/ApiAction.class.php @@ -57,11 +57,8 @@ public function handle(ServerRequestInterface $request): ResponseInterface } $dispatcher = cachedDispatcher( - static function (ConfigureRoutes $r) { - $event = new ControllerCollecting(); - EventHandler::getInstance()->fire($event); - - foreach ($event->getControllers() as $controller) { + function (ConfigureRoutes $r) { + foreach ($this->getControllers() as $controller) { $reflectionClass = new \ReflectionClass($controller); $attribute = current($reflectionClass->getAttributes(RequestType::class, \ReflectionAttribute::IS_INSTANCEOF)); \assert($attribute !== false); @@ -139,4 +136,46 @@ private function toErrorResponse( 'param' => $param, ], $reason->toStatusCode()); } + + /** + * @return array + */ + private function getControllers(): array + { + $controllers = []; + $directory = \WCF_DIR . 'lib/system/endpoint/controller/'; + $iterator = new \RecursiveIteratorIterator( + new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS) + ); + + foreach ($iterator as $file) { + if (!$file->isFile() || !\str_ends_with($file->getFilename(), '.class.php')) { + continue; + } + + $relativePath = \substr($file->getPathname(), \strlen($directory)); + $className = 'wcf\\system\\endpoint\\controller\\' . \str_replace('/', '\\', \substr($relativePath, 0, -\strlen('.class.php'))); + + if (!\class_exists($className)) { + continue; + } + + $reflectionClass = new \ReflectionClass($className); + if ($reflectionClass->isInstantiable() && $reflectionClass->implementsInterface(IController::class)) { + $controllers[$className] = $reflectionClass->newInstance(); + } + } + + $event = new ControllerCollecting(); + EventHandler::getInstance()->fire($event); + + foreach ($event->getControllers() as $controller) { + $className = \get_class($controller); + if (!isset($controllers[$className])) { + $controllers[$className] = $controller; + } + } + + return $controllers; + } } diff --git a/wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php b/wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php index a33995fcc1..87f6ef58eb 100644 --- a/wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php +++ b/wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php @@ -13,7 +13,6 @@ public function __invoke(): void { $this->initEventListeners(); - $this->initEndpoints(); $this->initACPMenuItems(); $this->initLicenseData(); } @@ -128,161 +127,6 @@ static function (\wcf\event\acp\dashboard\box\BoxCollecting $event) { ); } - private function initEndpoints(): void - { - EventHandler::getInstance()->register( - \wcf\event\endpoint\ControllerCollecting::class, - static function (\wcf\event\endpoint\ControllerCollecting $event) { - $event->register(new \wcf\system\endpoint\controller\core\articles\GetArticlePopover()); - $event->register(new \wcf\system\endpoint\controller\core\files\DeleteFile()); - $event->register(new \wcf\system\endpoint\controller\core\files\GenerateThumbnails()); - $event->register(new \wcf\system\endpoint\controller\core\files\PrepareUpload()); - $event->register(new \wcf\system\endpoint\controller\core\files\upload\SaveChunk()); - $event->register(new \wcf\system\endpoint\controller\core\comments\CreateComment()); - $event->register(new \wcf\system\endpoint\controller\core\comments\DeleteComment()); - $event->register(new \wcf\system\endpoint\controller\core\comments\EditComment()); - $event->register(new \wcf\system\endpoint\controller\core\comments\EnableComment()); - $event->register(new \wcf\system\endpoint\controller\core\comments\RenderComments()); - $event->register(new \wcf\system\endpoint\controller\core\comments\RenderComment()); - $event->register(new \wcf\system\endpoint\controller\core\comments\UpdateComment()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\CreateResponse()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\DeleteResponse()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\EditResponse()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\EnableResponse()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\RenderResponse()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\RenderResponses()); - $event->register(new \wcf\system\endpoint\controller\core\comments\responses\UpdateResponse()); - $event->register(new \wcf\system\endpoint\controller\core\devtools\projects\SyncVersion()); - $event->register(new \wcf\system\endpoint\controller\core\exceptions\RenderException()); - $event->register(new \wcf\system\endpoint\controller\core\gridViews\GetRows()); - $event->register(new \wcf\system\endpoint\controller\core\gridViews\GetGridView()); - $event->register(new \wcf\system\endpoint\controller\core\gridViews\GetRow()); - $event->register(new \wcf\system\endpoint\controller\core\cronjobs\logs\ClearLogs()); - $event->register(new \wcf\system\endpoint\controller\core\listViews\GetItems()); - $event->register(new \wcf\system\endpoint\controller\core\listViews\GetItem()); - $event->register(new \wcf\system\endpoint\controller\core\messages\GetMentionSuggestions()); - $event->register(new \wcf\system\endpoint\controller\core\messages\RenderQuote()); - $event->register(new \wcf\system\endpoint\controller\core\messages\ResetRemovalQuotes()); - $event->register(new \wcf\system\endpoint\controller\core\sessions\DeleteSession()); - $event->register(new \wcf\system\endpoint\controller\core\versionTrackers\RevertVersion()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\ChangeJustifiedStatus()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\CloseReport()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\DeleteContent()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\EnableContent()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\MarkModerationQueueAsRead()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\MarkAllModerationQueuesAsRead()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\GetUserMenuItems()); - $event->register(new \wcf\system\endpoint\controller\core\moderationQueues\GetModerationQueueHeaderTitle()); - $event->register(new \wcf\system\endpoint\controller\core\styles\AddDarkMode()); - $event->register(new \wcf\system\endpoint\controller\core\styles\CopyStyle()); - $event->register(new \wcf\system\endpoint\controller\core\styles\DeleteStyle()); - $event->register(new \wcf\system\endpoint\controller\core\styles\DisableStyle()); - $event->register(new \wcf\system\endpoint\controller\core\styles\EnableStyle()); - $event->register(new \wcf\system\endpoint\controller\core\styles\SetStyleAsDefault()); - $event->register(new \wcf\system\endpoint\controller\core\styles\ChangeStyle()); - $event->register(new \wcf\system\endpoint\controller\core\styles\GetStyleChooser()); - $event->register(new \wcf\system\endpoint\controller\core\users\options\DeleteOption()); - $event->register(new \wcf\system\endpoint\controller\core\users\options\DisableOption()); - $event->register(new \wcf\system\endpoint\controller\core\users\options\EnableOption()); - $event->register(new \wcf\system\endpoint\controller\core\users\ranks\DeleteUserRank()); - $event->register(new \wcf\system\endpoint\controller\core\users\trophies\DeleteUserTrophy()); - $event->register(new \wcf\system\endpoint\controller\core\interactions\GetBulkContextMenuOptions()); - $event->register(new \wcf\system\endpoint\controller\core\interactions\GetContextMenuOptions()); - $event->register(new \wcf\system\endpoint\controller\core\articles\DeleteArticle()); - $event->register(new \wcf\system\endpoint\controller\core\articles\SoftDeleteArticle()); - $event->register(new \wcf\system\endpoint\controller\core\articles\RestoreArticle()); - $event->register(new \wcf\system\endpoint\controller\core\articles\PublishArticle()); - $event->register(new \wcf\system\endpoint\controller\core\articles\UnpublishArticle()); - $event->register(new \wcf\system\endpoint\controller\core\articles\MarkAllArticlesAsRead()); - $event->register(new \wcf\system\endpoint\controller\core\articles\MarkArticleAsRead()); - $event->register(new \wcf\system\endpoint\controller\core\articles\contents\GetArticleContentHeaderTitle()); - $event->register(new \wcf\system\endpoint\controller\core\attachments\DeleteAttachment()); - $event->register(new \wcf\system\endpoint\controller\core\cronjobs\EnableCronjob()); - $event->register(new \wcf\system\endpoint\controller\core\cronjobs\DisableCronjob()); - $event->register(new \wcf\system\endpoint\controller\core\cronjobs\DeleteCronjob()); - $event->register(new \wcf\system\endpoint\controller\core\cronjobs\ExecuteCronjob()); - $event->register(new \wcf\system\endpoint\controller\core\captchas\questions\EnableQuestion()); - $event->register(new \wcf\system\endpoint\controller\core\captchas\questions\DisableQuestion()); - $event->register(new \wcf\system\endpoint\controller\core\captchas\questions\DeleteQuestion()); - $event->register(new \wcf\system\endpoint\controller\core\boxes\DisableBox()); - $event->register(new \wcf\system\endpoint\controller\core\boxes\EnableBox()); - $event->register(new \wcf\system\endpoint\controller\core\boxes\DeleteBox()); - $event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DeleteProvider()); - $event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DisableProvider()); - $event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\EnableProvider()); - $event->register(new \wcf\system\endpoint\controller\core\bbcodes\DeleteBBCode()); - $event->register(new \wcf\system\endpoint\controller\core\languages\DisableLanguage()); - $event->register(new \wcf\system\endpoint\controller\core\languages\DeleteLanguage()); - $event->register(new \wcf\system\endpoint\controller\core\languages\EnableLanguage()); - $event->register(new \wcf\system\endpoint\controller\core\languages\SetAsDefaultLanguage()); - $event->register(new \wcf\system\endpoint\controller\core\languages\items\DeleteItem()); - $event->register(new \wcf\system\endpoint\controller\core\labels\DeleteLabel()); - $event->register(new \wcf\system\endpoint\controller\core\labels\groups\ChangeLabelShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\labels\groups\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\labels\groups\DeleteGroup()); - $event->register(new \wcf\system\endpoint\controller\core\labels\groups\GetLabelShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\labels\groups\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\pages\DeletePage()); - $event->register(new \wcf\system\endpoint\controller\core\pages\DisablePage()); - $event->register(new \wcf\system\endpoint\controller\core\pages\EnablePage()); - $event->register(new \wcf\system\endpoint\controller\core\templates\groups\DeleteTemplateGroup()); - $event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\DisableServer()); - $event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\DeleteServer()); - $event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\EnableServer()); - $event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\DeleteSubscription()); - $event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\DisableSubscription()); - $event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\EnableSubscription()); - $event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\users\DeleteSubscriptionUser()); - $event->register(new \wcf\system\endpoint\controller\core\templates\DeleteTemplate()); - $event->register(new \wcf\system\endpoint\controller\core\tags\DeleteTag()); - $event->register(new \wcf\system\endpoint\controller\core\users\groups\assignments\DeleteAssignment()); - $event->register(new \wcf\system\endpoint\controller\core\users\groups\assignments\EnableAssignment()); - $event->register(new \wcf\system\endpoint\controller\core\users\groups\assignments\DisableAssignment()); - $event->register(new \wcf\system\endpoint\controller\core\users\activityEvents\RenderUserActivityEvents()); - $event->register(new \wcf\system\endpoint\controller\core\users\groups\DeleteGroup()); - $event->register(new \wcf\system\endpoint\controller\core\users\reactions\RenderUserReactions()); - $event->register(new \wcf\system\endpoint\controller\core\menus\DeleteMenu()); - $event->register(new \wcf\system\endpoint\controller\core\trophies\EnableTrophy()); - $event->register(new \wcf\system\endpoint\controller\core\trophies\DisableTrophy()); - $event->register(new \wcf\system\endpoint\controller\core\trophies\DeleteTrophy()); - $event->register(new \wcf\system\endpoint\controller\core\trophies\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\trophies\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\ads\EnableAd()); - $event->register(new \wcf\system\endpoint\controller\core\ads\DisableAd()); - $event->register(new \wcf\system\endpoint\controller\core\ads\DeleteAd()); - $event->register(new \wcf\system\endpoint\controller\core\ads\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\ads\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\notices\EnableNotice()); - $event->register(new \wcf\system\endpoint\controller\core\notices\DisableNotice()); - $event->register(new \wcf\system\endpoint\controller\core\notices\DeleteNotice()); - $event->register(new \wcf\system\endpoint\controller\core\notices\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\notices\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\notices\DismissNotice()); - $event->register(new \wcf\system\endpoint\controller\core\reactions\types\EnableType()); - $event->register(new \wcf\system\endpoint\controller\core\reactions\types\DisableType()); - $event->register(new \wcf\system\endpoint\controller\core\reactions\types\DeleteType()); - $event->register(new \wcf\system\endpoint\controller\core\reactions\types\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\reactions\types\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\smilies\DeleteSmiley()); - $event->register(new \wcf\system\endpoint\controller\core\smilies\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\smilies\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\smilies\categories\GetSmileyShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\smilies\categories\ChangeSmileyShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\attachments\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\contact\options\DeleteOption()); - $event->register(new \wcf\system\endpoint\controller\core\contact\options\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\contact\options\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\contact\options\DisableOption()); - $event->register(new \wcf\system\endpoint\controller\core\contact\options\EnableOption()); - $event->register(new \wcf\system\endpoint\controller\core\contact\recipients\DeleteRecipient()); - $event->register(new \wcf\system\endpoint\controller\core\contact\recipients\ChangeShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\contact\recipients\GetShowOrder()); - $event->register(new \wcf\system\endpoint\controller\core\contact\recipients\DisableRecipient()); - $event->register(new \wcf\system\endpoint\controller\core\contact\recipients\EnableRecipient()); - } - ); - } - private function initACPMenuItems(): void { EventHandler::getInstance()->register( diff --git a/wcfsetup/install/files/lib/event/endpoint/ControllerCollecting.class.php b/wcfsetup/install/files/lib/event/endpoint/ControllerCollecting.class.php index 885c6cf587..a63c8b0900 100644 --- a/wcfsetup/install/files/lib/event/endpoint/ControllerCollecting.class.php +++ b/wcfsetup/install/files/lib/event/endpoint/ControllerCollecting.class.php @@ -12,6 +12,7 @@ * @copyright 2001-2024 WoltLab GmbH * @license GNU Lesser General Public License * @since 6.1 + * @deprecated 6.3 Event is obsolete because endpoints are loaded automatically based on location. */ final class ControllerCollecting implements IPsr14Event {