在自定义Laravel命令的句柄中,您可以再次调用该命令吗?像这样,使用一些伪代码描述:
public function handle() {
code..
code..
$this->importantValue = $this->option('value'); //value is 'hello'
if(something) {
//call of the same command is made, but with different arguments or options
//command does stuff and ends successfully
$this->call('myself' [
'value' => 'ahoy'
];
//I expect the handle to be returned to the original command
}
var_dump($this->importantValue); //this equals 'ahoy'
}
为什么是这样?这个新命令的命令与它被调用的原始命令有什么共同之处?
编辑:新调用的命令将不会达到something
它不会再次调用自己(永远)。原始命令似乎从它离开的地方开始(在称自己为第一次也是唯一一次之前),但它似乎已经继承了“儿童”变量。
我认为调用Artisan::call()
而不是$this->call()
可能会避免这个问题(注意避免与解决不一样)......
@ t-maxx:我得到了完全相同的问题,我不确定@ben是否理解。
我有一个基于参数depth
递归的命令。 depth
参数设置为受保护的属性,作为handle()
的第一步。然后,如果depth
大于零,它会调用自己(通过$this->call()
),但通过$this->depth - 1
。我观察每一次连续的呼叫,它只是上下下降,从不停滞或弹跳是递归允许的,正如人们所期望的那样。
所以...虽然我不是100%确定发生了什么,但我想要获取depth
选项一次,但是将其作为变量传递(相对于对象上的属性)。我认为这很难看,但在得到认可和解决之前,它可能是唯一的解决方案。另一方面,可能是我们都做错了。
为我调用Artisan::call()
导致我宁愿避免的其他问题。我正在使用的命令写入文件,我不希望一堆单独的命令竞争同一个文件。
是的,你可以使用Programmatically Executing Commands Artisan::call
Artisan::call('myself', [
'value' => 'ahoy'
]);