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