Laravel命令 - 仅可选参数

34

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

order:check {--order}

并执行这个命令:

php artisan order:check --order 7

由于某种原因导致了这个异常

  [RuntimeException]                                 
  Too many arguments, expected arguments "command".  

为什么呢?我希望这个命令可以通过php artisan order:check来执行,也可以选择传入一个可选的订单id:php artisan order:check --order X


尝试使用 --order=X。这样可以将7解析为选项值而不是单独的参数。 - aynber
@aynber,他仍然需要在命令的定义中添加等号,就像Cy指出的那样。 - teeyo
@Michael 阅读章节:带有值的选项 https://laravel.com/docs/5.5/artisan - teeyo
2个回答

67

{--order}选项(不带=符号)声明了一个开关选项,它不需要任何参数。如果存在这个开关选项,则其值等于true,当不存在时,则为false--help就像一个开关——不需要参数)。

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

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

protected $signature = 'order:check {--order=}'

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

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

protected $signature = 'order:check {--order=7}'

...但是对于这种特定情况似乎没有用处。

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

$ php artisan order:check --order=7 
$ php artisan order:check --order 7 

然后在命令中使用order的值:

$orderNumber = $this->option('order');  // 7

在这种情况下,我认为他应该使用以下命令 php artisan order:check --order=7 来执行它。 - teeyo
3
@teeyo描述了“官方”的语法,但命令解析器支持常见的参数格式。在大多数情况下,“--order 7”也可以使用。 - Cy Rossignol
1
实际上,在 Laravel 6 中,如果您像这样描述一个选项 {--foo=},并且在运行命令时没有提供它,那么它的值就是 null - darighteous1

7
以上答案是正确的,但仍有一些额外的要点需要补充。希望以下内容能够帮助。 必需参数
protected $signature = 'order:check {param}';

可选参数

protected $signature = 'order:check {param?}';

带默认值的可选参数

protected $signature = 'order:check {param=foo}';

Reference: https://laravel.com/docs/5.2/artisan


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接