refactor(console): replace manual registration with auto-discovery

- console.php: scan cli/Commands/ and cli/CronJobs/ via glob + reflection
- console.php: load module commands via ModuleLoader::registerAllCommands()
- Remove ~150 lines of manual require_once + register calls
- CommandRegistry: update docblock to reflect auto-discovery approach
- New commands are discovered automatically by implementing CommandInterface
This commit is contained in:
Divarion-D
2026-03-16 22:33:32 +03:00
parent 7b0977c993
commit 85d8c8b932
2 changed files with 28 additions and 182 deletions

View File

@@ -6,7 +6,9 @@
* Хранит маппинг имя → экземпляр CommandInterface.
* Dispatch: ищет команду по имени из $argv и вызывает execute().
*
* Команды регистрируются явно — никакой авто-магии с директориями.
* Команды обнаруживаются автоматически: console.php сканирует
* cli/Commands/ и cli/CronJobs/ и регистрирует все классы,
* реализующие CommandInterface.
*/
class CommandRegistry {

View File

@@ -39,192 +39,36 @@ XC_Bootstrap::boot(XC_Bootstrap::CONTEXT_CLI, [
$rRegistry = new CommandRegistry();
// ── Daemon commands ──────────────────────────────────────────────
// ── Auto-discover: core Commands + CronJobs ──────────────────────
require_once __DIR__ . '/cli/Commands/SignalsCommand.php';
$rRegistry->register(new SignalsCommand());
$rCommandDirs = [
__DIR__ . '/cli/Commands',
__DIR__ . '/cli/CronJobs',
];
require_once __DIR__ . '/cli/Commands/WatchdogCommand.php';
$rRegistry->register(new WatchdogCommand());
require_once __DIR__ . '/cli/Commands/QueueCommand.php';
$rRegistry->register(new QueueCommand());
if (file_exists(__DIR__ . '/cli/Commands/CacheHandlerCommand.php')) {
require_once __DIR__ . '/cli/Commands/CacheHandlerCommand.php';
$rRegistry->register(new CacheHandlerCommand());
foreach ($rCommandDirs as $rDir) {
if (!is_dir($rDir)) {
continue;
}
foreach (glob($rDir . '/*.php') as $rFile) {
$rClassName = basename($rFile, '.php');
require_once $rFile;
if (class_exists($rClassName, false)) {
$rReflection = new ReflectionClass($rClassName);
if (!$rReflection->isAbstract() && $rReflection->implementsInterface('CommandInterface')) {
$rRegistry->register(new $rClassName());
}
}
}
}
require_once __DIR__ . '/cli/Commands/StartupCommand.php';
$rRegistry->register(new StartupCommand());
// ── Module commands ──────────────────────────────────────────────
// Модули регистрируют свои команды через ModuleInterface::registerCommands()
// Без filesystem scanning — каждый модуль явно знает свои команды.
require_once __DIR__ . '/cli/Commands/MonitorCommand.php';
$rRegistry->register(new MonitorCommand());
require_once __DIR__ . '/cli/Commands/ScannerCommand.php';
$rRegistry->register(new ScannerCommand());
if (file_exists(__DIR__ . '/cli/Commands/BalancerCommand.php')) {
require_once __DIR__ . '/cli/Commands/BalancerCommand.php';
$rRegistry->register(new BalancerCommand());
}
// ── Stream commands ──────────────────────────────────────────────
require_once __DIR__ . '/cli/Commands/ArchiveCommand.php';
$rRegistry->register(new ArchiveCommand());
require_once __DIR__ . '/cli/Commands/CreatedCommand.php';
$rRegistry->register(new CreatedCommand());
require_once __DIR__ . '/cli/Commands/DelayCommand.php';
$rRegistry->register(new DelayCommand());
require_once __DIR__ . '/cli/Commands/LoopbackCommand.php';
$rRegistry->register(new LoopbackCommand());
require_once __DIR__ . '/cli/Commands/LlodCommand.php';
$rRegistry->register(new LlodCommand());
require_once __DIR__ . '/cli/Commands/ProxyCommand.php';
$rRegistry->register(new ProxyCommand());
require_once __DIR__ . '/cli/Commands/RecordCommand.php';
$rRegistry->register(new RecordCommand());
require_once __DIR__ . '/cli/Commands/OndemandCommand.php';
$rRegistry->register(new OndemandCommand());
// ── Utility commands ─────────────────────────────────────────────
require_once __DIR__ . '/cli/Commands/ThumbnailCommand.php';
$rRegistry->register(new ThumbnailCommand());
require_once __DIR__ . '/cli/Commands/PlexItemCommand.php';
$rRegistry->register(new PlexItemCommand());
require_once __DIR__ . '/cli/Commands/WatchItemCommand.php';
$rRegistry->register(new WatchItemCommand());
require_once __DIR__ . '/cli/Commands/BinariesCommand.php';
$rRegistry->register(new BinariesCommand());
require_once __DIR__ . '/cli/Commands/CertbotCommand.php';
$rRegistry->register(new CertbotCommand());
require_once __DIR__ . '/cli/Commands/ToolsCommand.php';
$rRegistry->register(new ToolsCommand());
require_once __DIR__ . '/cli/Commands/UpdateCommand.php';
$rRegistry->register(new UpdateCommand());
if (file_exists(__DIR__ . '/cli/Commands/MigrateCommand.php')) {
require_once __DIR__ . '/cli/Commands/MigrateCommand.php';
$rRegistry->register(new MigrateCommand());
}
require_once __DIR__ . '/cli/Commands/ServiceCommand.php';
$rRegistry->register(new ServiceCommand());
require_once __DIR__ . '/cli/Commands/StatusCommand.php';
$rRegistry->register(new StatusCommand());
// ── Cron jobs ────────────────────────────────────────────────────
require_once __DIR__ . '/cli/CronJobs/ActivityCronJob.php';
$rRegistry->register(new ActivityCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/BackupsCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/BackupsCronJob.php';
$rRegistry->register(new BackupsCronJob());
}
require_once __DIR__ . '/cli/CronJobs/CacheCronJob.php';
$rRegistry->register(new CacheCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/CacheEngineCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/CacheEngineCronJob.php';
$rRegistry->register(new CacheEngineCronJob());
}
require_once __DIR__ . '/cli/CronJobs/CertbotCronJob.php';
$rRegistry->register(new CertbotCronJob());
require_once __DIR__ . '/cli/CronJobs/CleanupCronJob.php';
$rRegistry->register(new CleanupCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/EpgCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/EpgCronJob.php';
$rRegistry->register(new EpgCronJob());
}
require_once __DIR__ . '/cli/CronJobs/ErrorsCronJob.php';
$rRegistry->register(new ErrorsCronJob());
require_once __DIR__ . '/cli/CronJobs/LinesLogsCronJob.php';
$rRegistry->register(new LinesLogsCronJob());
require_once __DIR__ . '/cli/CronJobs/PlexCronJob.php';
$rRegistry->register(new PlexCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/ProvidersCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/ProvidersCronJob.php';
$rRegistry->register(new ProvidersCronJob());
}
if (file_exists(__DIR__ . '/cli/CronJobs/RootMysqlCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/RootMysqlCronJob.php';
$rRegistry->register(new RootMysqlCronJob());
}
require_once __DIR__ . '/cli/CronJobs/RootSignalsCronJob.php';
$rRegistry->register(new RootSignalsCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/SeriesCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/SeriesCronJob.php';
$rRegistry->register(new SeriesCronJob());
}
require_once __DIR__ . '/cli/CronJobs/ServersCronJob.php';
$rRegistry->register(new ServersCronJob());
require_once __DIR__ . '/cli/CronJobs/StatsCronJob.php';
$rRegistry->register(new StatsCronJob());
require_once __DIR__ . '/cli/CronJobs/StreamsCronJob.php';
$rRegistry->register(new StreamsCronJob());
require_once __DIR__ . '/cli/CronJobs/StreamsLogsCronJob.php';
$rRegistry->register(new StreamsLogsCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/TmdbCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/TmdbCronJob.php';
$rRegistry->register(new TmdbCronJob());
}
if (file_exists(__DIR__ . '/cli/CronJobs/TmdbPopularCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/TmdbPopularCronJob.php';
$rRegistry->register(new TmdbPopularCronJob());
}
require_once __DIR__ . '/cli/CronJobs/TmpCronJob.php';
$rRegistry->register(new TmpCronJob());
if (file_exists(__DIR__ . '/cli/CronJobs/UpdateCronJob.php')) {
require_once __DIR__ . '/cli/CronJobs/UpdateCronJob.php';
$rRegistry->register(new UpdateCronJob());
}
require_once __DIR__ . '/cli/CronJobs/UsersCronJob.php';
$rRegistry->register(new UsersCronJob());
require_once __DIR__ . '/cli/CronJobs/VodCronJob.php';
$rRegistry->register(new VodCronJob());
require_once __DIR__ . '/cli/CronJobs/WatchCronJob.php';
$rRegistry->register(new WatchCronJob());
// ─────────────────────────────────────────────────────────────────
$rModuleLoader = new ModuleLoader();
$rModuleLoader->loadAll();
$rModuleLoader->registerAllCommands($rRegistry);
// ─── Dispatch ────────────────────────────────────────────────────