Laravel 5 命令 - 一个接一个地执行
Laravel 5 Commands - Execute one after other
我有一个CustomCommand_1
和一个CustomCommand_2
。
有什么方法可以创建命令管道并在 CustomCommand_1
执行后立即执行 CustomCommand_2
? (没有在另一个里面调用命令)。
您可以使用回调来决定什么时候会或不会运行,使用 when() 或 skip():
$schedule
->call('Mailer@BusinessDayMailer')
->weekdays()
->skip(function(TypeHintedDeciderClass $decider)
{
return $decider->isHoliday();
}
);
转介:Event Scheduling and Commands & Handlers
您还可以阅读如何在队列中添加命令 here。
看看,是否有帮助。
我找不到任何方法来做到这一点,所以我想出了解决方法(在 laravel sync
驱动程序上测试)。
首先,你必须create/adjust基本命令:
namespace App\Commands;
use Illuminate\Foundation\Bus\DispatchesCommands;
abstract class Command {
use DispatchesCommands;
/**
* @var Command[]
*/
protected $commands = [];
/**
* @param Command|Command[] $command
*/
public function addNextCommand($command) {
if (is_array($command)) {
foreach ($command as $item) {
$this->commands[] = $item;
}
} else {
$this->commands[] = $command;
}
}
public function handlingCommandFinished() {
if (!$this->commands)
return;
$command = array_shift($this->commands);
$command->addNextCommand($this->commands);
$this->dispatch($command);
}
}
每个命令在完成执行时都必须调用 $this->handlingCommandFinished();
。
有了这个,您可以链接您的命令:
$command = new FirstCommand();
$command->addNextCommand(new SecondCommand());
$command->addNextCommand(new ThirdCommand());
$this->dispatch($command);
管道
您可以使用命令管道,而不是在每个命令中调用 handlingCommandFinished
!
在App\Providers\BusServiceProvider::boot
中添加:
$dispatcher->pipeThrough([
'App\Commands\Pipeline\ChainCommands'
]);
添加创建App\Commands\Pipeline\ChainCommands
:
class ChainCommands {
public function handle(Command $command, $next) {
$result = $next($command);
$command->handlingCommandFinished();
return $result;
}
}
是什么阻止您执行以下操作?
$this->dispatch(new CustomCommand_1);
$this->dispatch(new CustomCommand_2);
// And so on
我有一个CustomCommand_1
和一个CustomCommand_2
。
有什么方法可以创建命令管道并在 CustomCommand_1
执行后立即执行 CustomCommand_2
? (没有在另一个里面调用命令)。
您可以使用回调来决定什么时候会或不会运行,使用 when() 或 skip():
$schedule
->call('Mailer@BusinessDayMailer')
->weekdays()
->skip(function(TypeHintedDeciderClass $decider)
{
return $decider->isHoliday();
}
);
转介:Event Scheduling and Commands & Handlers
您还可以阅读如何在队列中添加命令 here。 看看,是否有帮助。
我找不到任何方法来做到这一点,所以我想出了解决方法(在 laravel sync
驱动程序上测试)。
首先,你必须create/adjust基本命令:
namespace App\Commands;
use Illuminate\Foundation\Bus\DispatchesCommands;
abstract class Command {
use DispatchesCommands;
/**
* @var Command[]
*/
protected $commands = [];
/**
* @param Command|Command[] $command
*/
public function addNextCommand($command) {
if (is_array($command)) {
foreach ($command as $item) {
$this->commands[] = $item;
}
} else {
$this->commands[] = $command;
}
}
public function handlingCommandFinished() {
if (!$this->commands)
return;
$command = array_shift($this->commands);
$command->addNextCommand($this->commands);
$this->dispatch($command);
}
}
每个命令在完成执行时都必须调用 $this->handlingCommandFinished();
。
有了这个,您可以链接您的命令:
$command = new FirstCommand();
$command->addNextCommand(new SecondCommand());
$command->addNextCommand(new ThirdCommand());
$this->dispatch($command);
管道
您可以使用命令管道,而不是在每个命令中调用 handlingCommandFinished
!
在App\Providers\BusServiceProvider::boot
中添加:
$dispatcher->pipeThrough([
'App\Commands\Pipeline\ChainCommands'
]);
添加创建App\Commands\Pipeline\ChainCommands
:
class ChainCommands {
public function handle(Command $command, $next) {
$result = $next($command);
$command->handlingCommandFinished();
return $result;
}
}
是什么阻止您执行以下操作?
$this->dispatch(new CustomCommand_1);
$this->dispatch(new CustomCommand_2);
// And so on