Laravel 5.5+ 默认启用命令自动发现,只需将继承 Illuminate\Console\Command 的类置于 app/Console/Commands 目录下、定义非空 $signature,即可被 php artisan list 自动识别;子目录不支持,且需执行 php artisan config:clear 刷新缓存。

直接上手就能用,不需要额外注册或改配置——Laravel 5.5+ 默认启用「命令自动发现」,只要类文件放在 app/Console/Commands 目录下、继承 Illuminate\Console\Command、且 $signature 属性不为空,Artisan 就能自动识别它。
生成命令类后不用手动注册
Laravel 5.5 引入了自动发现机制,省去了老版本必须在 app/Console/Kernel.php 的 $commands 数组里逐个添加的步骤。
- 运行
php artisan make:command BackupDatabase,文件会自动创建在app/Console/Commands/BackupDatabase.php - 只要该类中定义了非空的
$signature(比如protected $signature = 'backup:database';),就立刻可用 - 如果仍想手动控制加载顺序或兼容旧项目,才需要去
Kernel.php显式注册 - 注意:自动发现只扫描
app/Console/Commands下的 PHP 文件,子目录不生效(如app/Console/Commands/Tools/里的命令不会被发现)
$signature 语法决定参数和选项行为
签名不是随便写的名字,它直接决定了命令怎么被调用、哪些输入是必需的、哪些可选、是否带值。
-
{table}:必需位置参数,调用时必须提供,例如php artisan backup:database users -
{table?}:可选位置参数,没传时$this->argument('table')返回null -
{--force}:布尔型选项,加了就为true,不加就是false -
{--connection=}或{--connection=sqlite}:带值选项,$this->option('connection')取到字符串值;等号后写默认值仅作文档提示,不自动填充 - 多个选项或参数之间用空格分隔,不能混用等号和空格,例如
php artisan backup:database --connection=pgsql --force合法,而--connection pgsql会报错
handle() 里别直接 echo,用 Artisan 提供的方法输出
直接 echo 或 var_dump 会破坏 Artisan 的输出格式控制,尤其在管道、重定向或测试时容易出问题。
- 用
$this->info('Done!')输出绿色成功信息 - 用
$this->error('Connection failed')输出红色错误,并默认返回退出码 1 - 用
$this->warn('Deprecated option used')输出黄色警告 - 用
$this->line('Plain text')输出无样式纯文本 - 交互场景下优先用
$this->ask('Enter name:')或$this->confirm('Continue? [y/N]'),它们能正确处理 Ctrl+C、空输入等边界情况
命令里调用其他命令要小心退出码和输出捕获
在 handle() 中执行另一个 Artisan 命令(比如先迁移再 seed),不能简单用 exec() 或 shell_exec(),得走 Laravel 的调度通道。
- 用
$this->call('migrate', ['--force' => true])调用,返回的是整数退出码(0 表示成功) - 用
$this->callSilent('db:seed')避免嵌套命令的输出污染当前命令界面 - 如果需要捕获输出内容做判断,得用
Artisan::call()+Artisan::output(),但注意这会绕过当前命令的 I/O 对象,失去颜色和格式 - 别在生产环境命令里无条件调用
php artisan config:clear这类操作——它会清掉缓存,可能让正在运行的请求失败
最常被忽略的是签名语法细节和自动发现的路径限制:写错一个空格或把命令类放错目录,php artisan list 就完全看不到它,排查时容易卡在“为什么命令不显示”这个起点上。


















