Skip to content

Commit 02a40a2

Browse files
authored
Merge pull request #6608 from WoltLab/63-controller-auto-discover
Add auto-discover for RPC API controllers
2 parents b9e35c3 + 4bfeed3 commit 02a40a2

3 files changed

Lines changed: 45 additions & 161 deletions

File tree

wcfsetup/install/files/lib/action/ApiAction.class.php

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,8 @@ public function handle(ServerRequestInterface $request): ResponseInterface
5757
}
5858

5959
$dispatcher = cachedDispatcher(
60-
static function (ConfigureRoutes $r) {
61-
$event = new ControllerCollecting();
62-
EventHandler::getInstance()->fire($event);
63-
64-
foreach ($event->getControllers() as $controller) {
60+
function (ConfigureRoutes $r) {
61+
foreach ($this->getControllers() as $controller) {
6562
$reflectionClass = new \ReflectionClass($controller);
6663
$attribute = current($reflectionClass->getAttributes(RequestType::class, \ReflectionAttribute::IS_INSTANCEOF));
6764
\assert($attribute !== false);
@@ -139,4 +136,46 @@ private function toErrorResponse(
139136
'param' => $param,
140137
], $reason->toStatusCode());
141138
}
139+
140+
/**
141+
* @return array<string, IController>
142+
*/
143+
private function getControllers(): array
144+
{
145+
$controllers = [];
146+
$directory = \WCF_DIR . 'lib/system/endpoint/controller/';
147+
$iterator = new \RecursiveIteratorIterator(
148+
new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS)
149+
);
150+
151+
foreach ($iterator as $file) {
152+
if (!$file->isFile() || !\str_ends_with($file->getFilename(), '.class.php')) {
153+
continue;
154+
}
155+
156+
$relativePath = \substr($file->getPathname(), \strlen($directory));
157+
$className = 'wcf\\system\\endpoint\\controller\\' . \str_replace('/', '\\', \substr($relativePath, 0, -\strlen('.class.php')));
158+
159+
if (!\class_exists($className)) {
160+
continue;
161+
}
162+
163+
$reflectionClass = new \ReflectionClass($className);
164+
if ($reflectionClass->isInstantiable() && $reflectionClass->implementsInterface(IController::class)) {
165+
$controllers[$className] = $reflectionClass->newInstance();
166+
}
167+
}
168+
169+
$event = new ControllerCollecting();
170+
EventHandler::getInstance()->fire($event);
171+
172+
foreach ($event->getControllers() as $controller) {
173+
$className = \get_class($controller);
174+
if (!isset($controllers[$className])) {
175+
$controllers[$className] = $controller;
176+
}
177+
}
178+
179+
return $controllers;
180+
}
142181
}

wcfsetup/install/files/lib/bootstrap/com.woltlab.wcf.php

Lines changed: 0 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
public function __invoke(): void
1414
{
1515
$this->initEventListeners();
16-
$this->initEndpoints();
1716
$this->initACPMenuItems();
1817
$this->initLicenseData();
1918
}
@@ -128,161 +127,6 @@ static function (\wcf\event\acp\dashboard\box\BoxCollecting $event) {
128127
);
129128
}
130129

131-
private function initEndpoints(): void
132-
{
133-
EventHandler::getInstance()->register(
134-
\wcf\event\endpoint\ControllerCollecting::class,
135-
static function (\wcf\event\endpoint\ControllerCollecting $event) {
136-
$event->register(new \wcf\system\endpoint\controller\core\articles\GetArticlePopover());
137-
$event->register(new \wcf\system\endpoint\controller\core\files\DeleteFile());
138-
$event->register(new \wcf\system\endpoint\controller\core\files\GenerateThumbnails());
139-
$event->register(new \wcf\system\endpoint\controller\core\files\PrepareUpload());
140-
$event->register(new \wcf\system\endpoint\controller\core\files\upload\SaveChunk());
141-
$event->register(new \wcf\system\endpoint\controller\core\comments\CreateComment());
142-
$event->register(new \wcf\system\endpoint\controller\core\comments\DeleteComment());
143-
$event->register(new \wcf\system\endpoint\controller\core\comments\EditComment());
144-
$event->register(new \wcf\system\endpoint\controller\core\comments\EnableComment());
145-
$event->register(new \wcf\system\endpoint\controller\core\comments\RenderComments());
146-
$event->register(new \wcf\system\endpoint\controller\core\comments\RenderComment());
147-
$event->register(new \wcf\system\endpoint\controller\core\comments\UpdateComment());
148-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\CreateResponse());
149-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\DeleteResponse());
150-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\EditResponse());
151-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\EnableResponse());
152-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\RenderResponse());
153-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\RenderResponses());
154-
$event->register(new \wcf\system\endpoint\controller\core\comments\responses\UpdateResponse());
155-
$event->register(new \wcf\system\endpoint\controller\core\devtools\projects\SyncVersion());
156-
$event->register(new \wcf\system\endpoint\controller\core\exceptions\RenderException());
157-
$event->register(new \wcf\system\endpoint\controller\core\gridViews\GetRows());
158-
$event->register(new \wcf\system\endpoint\controller\core\gridViews\GetGridView());
159-
$event->register(new \wcf\system\endpoint\controller\core\gridViews\GetRow());
160-
$event->register(new \wcf\system\endpoint\controller\core\cronjobs\logs\ClearLogs());
161-
$event->register(new \wcf\system\endpoint\controller\core\listViews\GetItems());
162-
$event->register(new \wcf\system\endpoint\controller\core\listViews\GetItem());
163-
$event->register(new \wcf\system\endpoint\controller\core\messages\GetMentionSuggestions());
164-
$event->register(new \wcf\system\endpoint\controller\core\messages\RenderQuote());
165-
$event->register(new \wcf\system\endpoint\controller\core\messages\ResetRemovalQuotes());
166-
$event->register(new \wcf\system\endpoint\controller\core\sessions\DeleteSession());
167-
$event->register(new \wcf\system\endpoint\controller\core\versionTrackers\RevertVersion());
168-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\ChangeJustifiedStatus());
169-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\CloseReport());
170-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\DeleteContent());
171-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\EnableContent());
172-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\MarkModerationQueueAsRead());
173-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\MarkAllModerationQueuesAsRead());
174-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\GetUserMenuItems());
175-
$event->register(new \wcf\system\endpoint\controller\core\moderationQueues\GetModerationQueueHeaderTitle());
176-
$event->register(new \wcf\system\endpoint\controller\core\styles\AddDarkMode());
177-
$event->register(new \wcf\system\endpoint\controller\core\styles\CopyStyle());
178-
$event->register(new \wcf\system\endpoint\controller\core\styles\DeleteStyle());
179-
$event->register(new \wcf\system\endpoint\controller\core\styles\DisableStyle());
180-
$event->register(new \wcf\system\endpoint\controller\core\styles\EnableStyle());
181-
$event->register(new \wcf\system\endpoint\controller\core\styles\SetStyleAsDefault());
182-
$event->register(new \wcf\system\endpoint\controller\core\styles\ChangeStyle());
183-
$event->register(new \wcf\system\endpoint\controller\core\styles\GetStyleChooser());
184-
$event->register(new \wcf\system\endpoint\controller\core\users\options\DeleteOption());
185-
$event->register(new \wcf\system\endpoint\controller\core\users\options\DisableOption());
186-
$event->register(new \wcf\system\endpoint\controller\core\users\options\EnableOption());
187-
$event->register(new \wcf\system\endpoint\controller\core\users\ranks\DeleteUserRank());
188-
$event->register(new \wcf\system\endpoint\controller\core\users\trophies\DeleteUserTrophy());
189-
$event->register(new \wcf\system\endpoint\controller\core\interactions\GetBulkContextMenuOptions());
190-
$event->register(new \wcf\system\endpoint\controller\core\interactions\GetContextMenuOptions());
191-
$event->register(new \wcf\system\endpoint\controller\core\articles\DeleteArticle());
192-
$event->register(new \wcf\system\endpoint\controller\core\articles\SoftDeleteArticle());
193-
$event->register(new \wcf\system\endpoint\controller\core\articles\RestoreArticle());
194-
$event->register(new \wcf\system\endpoint\controller\core\articles\PublishArticle());
195-
$event->register(new \wcf\system\endpoint\controller\core\articles\UnpublishArticle());
196-
$event->register(new \wcf\system\endpoint\controller\core\articles\MarkAllArticlesAsRead());
197-
$event->register(new \wcf\system\endpoint\controller\core\articles\MarkArticleAsRead());
198-
$event->register(new \wcf\system\endpoint\controller\core\articles\contents\GetArticleContentHeaderTitle());
199-
$event->register(new \wcf\system\endpoint\controller\core\attachments\DeleteAttachment());
200-
$event->register(new \wcf\system\endpoint\controller\core\cronjobs\EnableCronjob());
201-
$event->register(new \wcf\system\endpoint\controller\core\cronjobs\DisableCronjob());
202-
$event->register(new \wcf\system\endpoint\controller\core\cronjobs\DeleteCronjob());
203-
$event->register(new \wcf\system\endpoint\controller\core\cronjobs\ExecuteCronjob());
204-
$event->register(new \wcf\system\endpoint\controller\core\captchas\questions\EnableQuestion());
205-
$event->register(new \wcf\system\endpoint\controller\core\captchas\questions\DisableQuestion());
206-
$event->register(new \wcf\system\endpoint\controller\core\captchas\questions\DeleteQuestion());
207-
$event->register(new \wcf\system\endpoint\controller\core\boxes\DisableBox());
208-
$event->register(new \wcf\system\endpoint\controller\core\boxes\EnableBox());
209-
$event->register(new \wcf\system\endpoint\controller\core\boxes\DeleteBox());
210-
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DeleteProvider());
211-
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\DisableProvider());
212-
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\media\providers\EnableProvider());
213-
$event->register(new \wcf\system\endpoint\controller\core\bbcodes\DeleteBBCode());
214-
$event->register(new \wcf\system\endpoint\controller\core\languages\DisableLanguage());
215-
$event->register(new \wcf\system\endpoint\controller\core\languages\DeleteLanguage());
216-
$event->register(new \wcf\system\endpoint\controller\core\languages\EnableLanguage());
217-
$event->register(new \wcf\system\endpoint\controller\core\languages\SetAsDefaultLanguage());
218-
$event->register(new \wcf\system\endpoint\controller\core\languages\items\DeleteItem());
219-
$event->register(new \wcf\system\endpoint\controller\core\labels\DeleteLabel());
220-
$event->register(new \wcf\system\endpoint\controller\core\labels\groups\ChangeLabelShowOrder());
221-
$event->register(new \wcf\system\endpoint\controller\core\labels\groups\ChangeShowOrder());
222-
$event->register(new \wcf\system\endpoint\controller\core\labels\groups\DeleteGroup());
223-
$event->register(new \wcf\system\endpoint\controller\core\labels\groups\GetLabelShowOrder());
224-
$event->register(new \wcf\system\endpoint\controller\core\labels\groups\GetShowOrder());
225-
$event->register(new \wcf\system\endpoint\controller\core\pages\DeletePage());
226-
$event->register(new \wcf\system\endpoint\controller\core\pages\DisablePage());
227-
$event->register(new \wcf\system\endpoint\controller\core\pages\EnablePage());
228-
$event->register(new \wcf\system\endpoint\controller\core\templates\groups\DeleteTemplateGroup());
229-
$event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\DisableServer());
230-
$event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\DeleteServer());
231-
$event->register(new \wcf\system\endpoint\controller\core\packages\updates\servers\EnableServer());
232-
$event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\DeleteSubscription());
233-
$event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\DisableSubscription());
234-
$event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\EnableSubscription());
235-
$event->register(new \wcf\system\endpoint\controller\core\paidSubscriptions\users\DeleteSubscriptionUser());
236-
$event->register(new \wcf\system\endpoint\controller\core\templates\DeleteTemplate());
237-
$event->register(new \wcf\system\endpoint\controller\core\tags\DeleteTag());
238-
$event->register(new \wcf\system\endpoint\controller\core\users\groups\assignments\DeleteAssignment());
239-
$event->register(new \wcf\system\endpoint\controller\core\users\groups\assignments\EnableAssignment());
240-
$event->register(new \wcf\system\endpoint\controller\core\users\groups\assignments\DisableAssignment());
241-
$event->register(new \wcf\system\endpoint\controller\core\users\activityEvents\RenderUserActivityEvents());
242-
$event->register(new \wcf\system\endpoint\controller\core\users\groups\DeleteGroup());
243-
$event->register(new \wcf\system\endpoint\controller\core\users\reactions\RenderUserReactions());
244-
$event->register(new \wcf\system\endpoint\controller\core\menus\DeleteMenu());
245-
$event->register(new \wcf\system\endpoint\controller\core\trophies\EnableTrophy());
246-
$event->register(new \wcf\system\endpoint\controller\core\trophies\DisableTrophy());
247-
$event->register(new \wcf\system\endpoint\controller\core\trophies\DeleteTrophy());
248-
$event->register(new \wcf\system\endpoint\controller\core\trophies\GetShowOrder());
249-
$event->register(new \wcf\system\endpoint\controller\core\trophies\ChangeShowOrder());
250-
$event->register(new \wcf\system\endpoint\controller\core\ads\EnableAd());
251-
$event->register(new \wcf\system\endpoint\controller\core\ads\DisableAd());
252-
$event->register(new \wcf\system\endpoint\controller\core\ads\DeleteAd());
253-
$event->register(new \wcf\system\endpoint\controller\core\ads\GetShowOrder());
254-
$event->register(new \wcf\system\endpoint\controller\core\ads\ChangeShowOrder());
255-
$event->register(new \wcf\system\endpoint\controller\core\notices\EnableNotice());
256-
$event->register(new \wcf\system\endpoint\controller\core\notices\DisableNotice());
257-
$event->register(new \wcf\system\endpoint\controller\core\notices\DeleteNotice());
258-
$event->register(new \wcf\system\endpoint\controller\core\notices\GetShowOrder());
259-
$event->register(new \wcf\system\endpoint\controller\core\notices\ChangeShowOrder());
260-
$event->register(new \wcf\system\endpoint\controller\core\notices\DismissNotice());
261-
$event->register(new \wcf\system\endpoint\controller\core\reactions\types\EnableType());
262-
$event->register(new \wcf\system\endpoint\controller\core\reactions\types\DisableType());
263-
$event->register(new \wcf\system\endpoint\controller\core\reactions\types\DeleteType());
264-
$event->register(new \wcf\system\endpoint\controller\core\reactions\types\GetShowOrder());
265-
$event->register(new \wcf\system\endpoint\controller\core\reactions\types\ChangeShowOrder());
266-
$event->register(new \wcf\system\endpoint\controller\core\smilies\DeleteSmiley());
267-
$event->register(new \wcf\system\endpoint\controller\core\smilies\GetShowOrder());
268-
$event->register(new \wcf\system\endpoint\controller\core\smilies\ChangeShowOrder());
269-
$event->register(new \wcf\system\endpoint\controller\core\smilies\categories\GetSmileyShowOrder());
270-
$event->register(new \wcf\system\endpoint\controller\core\smilies\categories\ChangeSmileyShowOrder());
271-
$event->register(new \wcf\system\endpoint\controller\core\attachments\ChangeShowOrder());
272-
$event->register(new \wcf\system\endpoint\controller\core\contact\options\DeleteOption());
273-
$event->register(new \wcf\system\endpoint\controller\core\contact\options\ChangeShowOrder());
274-
$event->register(new \wcf\system\endpoint\controller\core\contact\options\GetShowOrder());
275-
$event->register(new \wcf\system\endpoint\controller\core\contact\options\DisableOption());
276-
$event->register(new \wcf\system\endpoint\controller\core\contact\options\EnableOption());
277-
$event->register(new \wcf\system\endpoint\controller\core\contact\recipients\DeleteRecipient());
278-
$event->register(new \wcf\system\endpoint\controller\core\contact\recipients\ChangeShowOrder());
279-
$event->register(new \wcf\system\endpoint\controller\core\contact\recipients\GetShowOrder());
280-
$event->register(new \wcf\system\endpoint\controller\core\contact\recipients\DisableRecipient());
281-
$event->register(new \wcf\system\endpoint\controller\core\contact\recipients\EnableRecipient());
282-
}
283-
);
284-
}
285-
286130
private function initACPMenuItems(): void
287131
{
288132
EventHandler::getInstance()->register(

wcfsetup/install/files/lib/event/endpoint/ControllerCollecting.class.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
* @copyright 2001-2024 WoltLab GmbH
1313
* @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
1414
* @since 6.1
15+
* @deprecated 6.3 Event is obsolete because endpoints are loaded automatically based on location.
1516
*/
1617
final class ControllerCollecting implements IPsr14Event
1718
{

0 commit comments

Comments
 (0)