Laravel命令 - 只有可选参数

The*_*Guy 12 php laravel artisan laravel-5.1

我有一个带有此签名的命令

order:check {--order}
Run Code Online (Sandbox Code Playgroud)

并执行此:

php artisan order:check --order 7
Run Code Online (Sandbox Code Playgroud)

由于某种原因导致此异常

  [RuntimeException]                                 
  Too many arguments, expected arguments "command".  
Run Code Online (Sandbox Code Playgroud)

为什么?我希望这个命令既可以作为php artisan order:check可选订单ID 执行,也可以使用可选订单ID执行php artisan order:check --order X

Cy *_*nol 20

{--order}选项(无=符号)声明了一个开关选项,这需要没有参数.如果存在switch选项,则其值等于true,并且当不存在时,false(--help就像一个switch-no arguments).

当我们在此命令的命令行上提供参数时,控制台框架无法将输入与带参数的选项匹配,因此它会抛出错误,如问题所示.

要允许该选项接受参数,请将命令更改$signature为:

protected $signature = 'order:check {--order=}'
Run Code Online (Sandbox Code Playgroud)

注意之后添加等号--order.这告诉框架该--order选项需要一个参数 - 如果用户没有提供参数,该命令将抛出异常.

如果我们希望我们的命令接受带或不带参数的选项,我们可以使用类似的语法来提供默认值:

protected $signature = 'order:check {--order=7}'
Run Code Online (Sandbox Code Playgroud)

......但这对这个特殊情况似乎没有用.

在我们设置之后,我们可以调用命令,传递参数--order.该框架支持两种格式:

$ php artisan order:check --order=7 
$ php artisan order:check --order 7 
Run Code Online (Sandbox Code Playgroud)

...然后使用order我们命令中的值:

$orderNumber = $this->option('order');  // 7
Run Code Online (Sandbox Code Playgroud)

  • @teeyo您描述了"官方"语法,但命令解析器支持两种常见的参数格式.`--order 7`在大多数情况下也适用. (3认同)

Sou*_*rik 8

上面的答案是正确的,但仍试图添加一些额外的点。希望以下内容有所帮助

强制参数

protected $signature = 'order:check {param}';
Run Code Online (Sandbox Code Playgroud)

可选参数

protected $signature = 'order:check {param?}';
Run Code Online (Sandbox Code Playgroud)

具有默认值的可选参数

protected $signature = 'order:check {param=foo}';
Run Code Online (Sandbox Code Playgroud)

参考: https: //laravel.com/docs/5.2/artisan