2017-10-10 75 views
3

我有一个命令与此签名Laravel命令 - 只有可选的参数

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

+0

尝试'--order = X'。它可能将7解析为单独的参数而不是选项值。 – aynber

+0

@aynber他仍然需要添加等号的命令的定义像Cy指出 – teeyo

+0

@Michael阅读部分:**选项与价值** https://laravel.com/docs/5.5/artisan – teeyo

回答

4

{--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->argument('order'); // 7 
+0

在在这种情况下,我认为他应该使用folllowing命令'php artisan order:check --order = 7'来执行它。 – teeyo

+2

@teeyo您描述了“官方”语法,但命令解析器支持通用参数格式。 ' - order 7'在大多数情况下也可以工作。 –