032058-Test模块命令自动发现机制实现.md 2.6 KB

Test模块命令自动发现机制实现

时间: 2025年07月03日 20:58
任务: 为Test模块实现命令自动发现机制
状态: ✅ 已完成

任务背景

用户询问Laravel中 app/Console/Commands/* 的命令是否能自动发现,以及 app/Module/Test/Commands/* 的命令是否也能自动发现。

发现的问题

  1. app/Console/Commands/* ✅ 可以自动发现

    • 通过 app/Console/Kernel.php 中的 $this->load(__DIR__.'/Commands') 实现
    • Laravel框架级别的自动发现机制
  2. app/Module/*/Commands/* ❌ 不能自动发现

    • 需要在各模块的ServiceProvider中手动注册
    • 模块级别需要手动管理

解决方案

为Test模块实现了类似Laravel Kernel的自动发现机制:

1. 修改TestServiceProvider

// app/Module/Test/Providers/TestServiceProvider.php
protected function registerCommands(): void
{
    if ($this->app->runningInConsole()) {
        // 自动发现并注册Test模块Commands目录下的所有命令
        $this->loadCommandsFrom(__DIR__ . '/../Commands');
    }
}

protected function loadCommandsFrom(string $path): void
{
    // 扫描目录下所有PHP文件
    // 推导类名并验证是否为有效Command类
    // 自动注册到Laravel命令系统
}

2. 创建测试命令

  • TestModuleCommandDiscoveryCommand.php - 测试命令发现机制
  • TestAutoDiscoveryCommand.php - 验证自动发现功能(未手动注册)

验证结果

Test模块中的4个命令全部被自动发现

  • test - TestCommands.php
  • test:auto-discovery - TestAutoDiscoveryCommand.php (新创建,未手动注册)
  • test:module-command-discovery - TestModuleCommandDiscoveryCommand.php
  • test:urs-referral-sync - TestUrsReferralSyncCommand.php

技术特性

  • 无需手动注册: 新增命令文件后自动被发现
  • 智能过滤: 只注册Command子类且非抽象类
  • 独立模块: 只影响Test模块,其他模块保持原有机制
  • 兼容性: 与Laravel原生机制保持一致

提交信息

git commit -m "为Test模块实现命令自动发现机制

- 修改TestServiceProvider,添加loadCommandsFrom()自动发现方法
- 创建TestModuleCommandDiscoveryCommand测试命令发现机制
- 创建TestAutoDiscoveryCommand验证自动发现功能
- Test模块现在支持像app/Console/Commands/*一样的自动命令发现
- 新增命令无需手动在ServiceProvider中注册"

总结

成功为Test模块实现了命令自动发现机制,现在Test模块具备了与 app/Console/Commands/* 相同的自动发现能力。其他模块保持原有的手动注册机制不变。