tp5自定义命令必须在application/command.php中显式注册,类需继承think\console\command并实现configure()(含setname和setdescription)与execute()方法,参数选项须用addargument()/addoption()声明。

tp5 自定义命令必须放在 application/command.php 配置中
TP5 的命令行功能不靠自动扫描,而是依赖 application/command.php 这个显式配置文件。漏掉这一步,php think your:command 会直接报错 “Command not found”。这个文件本质是一个返回数组的 PHP 脚本,键是命令别名,值是完整命名空间类路径。
常见错误现象:php think test 提示找不到命令,但类文件明明存在、命名空间也对——大概率就是没在 command.php 里注册。
- 确保
command.php返回的是形如return ['test' => 'app\admin\command\Test'];的数组 - 类路径必须和实际文件位置、命名空间严格一致(注意大小写,Windows 下有时会掩盖问题)
- 如果用模块化结构(比如
admin模块),类必须放在对应模块的command目录下,不能丢进common或根command
自定义命令类要继承 think\console\Command
TP5 不接受裸类或普通函数作为命令。必须继承 think\console\Command,并实现 configure() 和 execute() 两个抽象方法。少一个,运行时就会 fatal error。
容易踩的坑:configure() 里只调 setName() 不够,还得配 setDescription();否则 php think list 里命令会显示为空描述,且某些版本会静默跳过该命令。
-
configure()中建议同时设置setName('your:cmd')和setDescription('说明文字') -
execute()方法签名必须是(Input $input, Output $output),参数类型不能省略或写错 - 不要在
execute()里直接echo,要用$output->writeln(),否则颜色、换行、管道重定向会异常
传参和选项要用 addArgument() 与 addOption()
TP5 命令行参数解析不支持类似 Laravel 的 {param} 或 {param?} 语法糖,一切靠 addArgument() 和 addOption() 显式声明。没声明的参数,$input->getArgument() 拿不到;没声明的选项,$input->getOption() 返回 null。
典型误用:写了 php think test --force,但在 configure() 里只加了 addArgument('force') ——这是错的,--force 是 option,不是 argument。
- 必填参数:
$this->addArgument('name', Argument::REQUIRED) - 可选参数:
$this->addArgument('count', Argument::OPTIONAL) - 短选项(如
-f):$this->addOption('force', 'f', Option::VALUE_NONE) - 带值选项(如
--env=prod):$this->addOption('env', 'e', Option::VALUE_REQUIRED)
扩展函数不能直接塞进命令类里用
TP5 命令执行时不会自动加载 application/common.php 或其他扩展函数文件。如果你在命令里调用了自定义函数(比如 my_log()),而没手动引入,就会报 Call to undefined function。
根本原因:命令行入口 think 启动流程绕过了 HTTP 请求的完整生命周期,common.php 默认只在应用初始化阶段(App::run())被加载一次,命令行不触发它。
- 最稳妥方式:在命令类的
execute()开头加include APP_PATH . 'common.php'; - 或者改用
Loader::import()加载特定函数文件(需确认 Loader 可用) - 不推荐在
command.php里require公共函数——它只在命令注册时执行一次,不影响后续命令运行时环境











