laravel artisan 命令支持数组参数和选项,通过 {param} 或 {--option=} 定义,自动聚合成字符串数组;必填用 {param},可选用 {param?}(laravel 9+),注意语法无空格、顺序限制及命名冲突。

在 Laravel Artisan 命令中传入数组参数,核心是使用 * 通配符标记参数或选项,让 Laravel 将重复出现的值自动聚合成数组。
数组参数(位置参数)
在 $signature 中用 {param*} 定义可变数量的必填数组参数:
protected $signature = 'process:items {ids*}';- 调用方式:
php artisan process:items 1 2 3 - 在
handle()中获取:$this->argument('ids')→ 返回['1', '2', '3'](字符串数组) - 注意:
{ids*}是必填的;若想支持“零个或多个”,需配合可选语法:{ids?*}(Laravel 9+ 支持),此时不传任何值时返回空数组[],而非null
数组选项(带 -- 前缀)
对选项同样可用 *,适用于多值开关类场景,比如指定多个字段或标签:
protected $signature = 'import:data {--fields=*}';- 调用方式:
php artisan import:data --fields=name --fields=email --fields=phone - 获取方式:
$this->option('fields')→ 返回['name', 'email', 'phone'] - 也可混用等号写法:
--fields=name,email,phone,但需自行用explode()拆分,不推荐——失去原生数组语义
注意事项与常见坑
数组参数不是“一次传一个字符串再 explode”,而是由 Symfony Console 底层按命令行词法解析后直接组装。务必注意:
- 签名里不能加空格:
{ids *}或{ids* }都非法,必须是{ids*} - 数组参数和普通参数不能混序:如果定义了
{id} {names*},则第一个值固定为id,后续所有值都归入names;反过来{names*} {id}是无效的(Laravel 不支持尾随必填参数) - 布尔选项(如
{--force})和数组选项不可同名,否则覆盖;避免用--tags*和--tags同时存在 - 测试时可通过
$this->call('command:name', ['ids' => ['1','2']])传入数组,模拟 CLI 行为
实际小例子
假设要批量删除用户,支持传多个 ID:
- 签名:
user:delete {ids*} {--force} - 处理逻辑中:
$ids = $this->argument('ids'); if (empty($ids)) { $this->error('至少提供一个用户 ID'); return 1; } - 执行:
php artisan user:delete 101 102 105 --force











