如何在命令行上运行Laravel Tasks时传递多个参数?

did*_*d1k 7 php laravel

我创建了一个Task类,其方法需要多个参数:

class Sample_Task
{
    public function create($arg1, $arg2) {
        // something here
    }
}
Run Code Online (Sandbox Code Playgroud)

但似乎工匠只得到第一个论点:

php artisan sample:create arg1 arg2
Run Code Online (Sandbox Code Playgroud)

错误信息:

Warning: Missing argument 2 for Sample_Task::create()
Run Code Online (Sandbox Code Playgroud)

如何在这个方法中传递多个参数?

小智 7

class Sample_Task
{
    public function create($args) {
       $arg1 = $args[0];
       $arg2 = $args[1];
        // something here
    }
}
Run Code Online (Sandbox Code Playgroud)


Wil*_*ell 5

Laravel 5.2

您需要做的是在$signature属性中将参数(或选项,例如--option)指定为array。Laravel用星号表示这一点。

争论

例如,假设您有一个Artisan命令来“处理”图像:

protected $signature = 'image:process {id*}';
Run Code Online (Sandbox Code Playgroud)

如果您这样做:

php artisan help image:process
Run Code Online (Sandbox Code Playgroud)

…Laravel将负责添加正确的Unix风格的语法:

Usage:
  image:process <id> (<id>)...
Run Code Online (Sandbox Code Playgroud)

要访问列表,在handle()方法中,只需使用:

$arguments = $this->argument('id');

foreach($arguments as $arg) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

选件

我说过它也适用于选项,您可以使用{--id=*}in $signature

帮助文本将显示:

Usage:
  image:process [options]

Options:
      --id[=ID]         (multiple values allowed)
  -h, --help            Display this help message

  ...
Run Code Online (Sandbox Code Playgroud)

因此,用户将键入:

php artisan image:process --id=1 --id=2 --id=3
Run Code Online (Sandbox Code Playgroud)

要访问中的数据handle(),您可以使用:

$ids = $this->option('id');
Run Code Online (Sandbox Code Playgroud)

如果省略“ id”,则将获得所有选项,包括“ quiet”,“ verbose”等的布尔值。

$options = $this->option();
Run Code Online (Sandbox Code Playgroud)

您可以在中访问ID列表 $options['id']

Laravel Artisan指南中的更多信息。