从同一命令调用artisan命令

问题描述 投票:0回答:2

在自定义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它不会再次调用自己(永远)。原始命令似乎从它离开的地方开始(在称自己为第一次也是唯一一次之前),但它似乎已经继承了“儿童”变量。

php laravel artisan
2个回答
1
投票

我认为调用Artisan::call()而不是$this->call()可能会避免这个问题(注意避免与解决不一样)......

@ t-maxx:我得到了完全相同的问题,我不确定@ben是否理解。

我有一个基于参数depth递归的命令。 depth参数设置为受保护的属性,作为handle()的第一步。然后,如果depth大于零,它会调用自己(通过$this->call()),但通过$this->depth - 1。我观察每一次连续的呼叫,它只是上下下降,从不停滞或弹跳是递归允许的,正如人们所期望的那样。

所以...虽然我不是100%确定发生了什么,但我想要获取depth选项一次,但是将其作为变量传递(相对于对象上的属性)。我认为这很难看,但在得到认可和解决之前,它可能是唯一的解决方案。另一方面,可能是我们都做错了。

为我调用Artisan::call()导致我宁愿避免的其他问题。我正在使用的命令写入文件,我不希望一堆单独的命令竞争同一个文件。


0
投票

是的,你可以使用Programmatically Executing Commands Artisan::call

Artisan::call('myself', [
    'value' => 'ahoy'
]);
© www.soinside.com 2019 - 2024. All rights reserved.