在 Laravel 中创建自定义 Artisan 命令需运行 php artisan make:command SendNewsletter 生成类,修改 $signature 和 $description 定义命令签名与描述,于 handle() 方法中用 $this->argument() 和 $this->option() 获取参数与选项,并使用 $this->info() 等方法输出提示,返回 0 表示成功。

在 Laravel 中创建自定义 Artisan 命令非常简单,核心是使用 make:command 命令生成类,然后在 handle() 方法中编写逻辑。
生成命令类
运行以下 Artisan 命令,Laravel 会自动生成一个带命名空间的命令类(位于 app/Console/Commands/):
php artisan make:command SendNewsletter
生成的类默认包含 signature(命令名和参数定义)和 handle()(执行逻辑)两个关键属性/方法。
定义命令签名与描述
在生成的 SendNewsletter.php 中,修改 $signature 和 $description:
protected $signature = 'newsletter:send {--force : 是否强制发送} {email? : 接收者邮箱}';
protected $description = '发送订阅邮件';
-
{email?}表示可选参数(末尾加?) -
{--force}是布尔型选项,运行时用--force启用 - 签名支持更复杂的格式,如
{email : 邮箱地址} {--limit=100 : 最大发送数量}
编写执行逻辑(handle 方法)
在 handle() 中写业务代码,并善用 Artisan 提供的辅助方法:
public function handle()
{
$email = $this->argument('email');
$force = $this->option('force');
if (!$email && !$force) {
$this->error('请提供 email 或使用 --force');
return 1;
}
// 模拟发送
$this->info("正在向 {$email} 发送邮件...");
// Mail::to($email)->send(new NewsletterMail());
$this->line('✅ 邮件已排队发送');
return 0;
}
- 用
$this->argument('xxx')获取参数值 - 用
$this->option('xxx')获取选项值 -
$this->info()、$this->error()、$this->warn()等输出带颜色提示 - 返回
0表示成功,非0表示失败(可用于 shell 脚本判断)
注册并运行命令
新命令默认已自动注册(Laravel 8+ 使用命令自动发现),无需手动添加到 app/Console/Kernel.php 的 $commands 数组。确认注册可用:
php artisan list | grep newsletter
运行命令示例:
php artisan newsletter:send test@example.com php artisan newsletter:send --force php artisan newsletter:send --force --env=production
基本上就这些。不复杂但容易忽略的是:签名语法要写对、参数取值要用对应方法、退出码别忘了设 —— 这些细节决定了命令是否健壮好用。










