Laravel 5命令 - 一个接一个地执行

时间:2015-04-25 15:23:31

标签: laravel command queue laravel-5

我有一个CustomCommand_1和一个CustomCommand_2

CustomCommand_2执行后立即创建命令管道并执行CustomCommand_1的任何方法? (不在另一个内部调用命令)。

3 个答案:

答案 0 :(得分:1)

使用when()或skip()时,您可以使用回调来确定何时会运行或不运行:

$schedule
    ->call('Mailer@BusinessDayMailer')
    ->weekdays()
    ->skip(function(TypeHintedDeciderClass $decider)
    {
        return $decider->isHoliday();
    }
);

简称:Event SchedulingCommands & Handlers

您还可以阅读如何在队列here中添加命令。 如果有帮助的话,请参阅。

答案 1 :(得分:0)

我找不到任何办法,所以我找到了解决办法(在laravel sync驱动程序上测试过)。

首先,您必须创建/调整基本命令:

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;
    }
}

答案 2 :(得分:0)

是什么阻止你做以下事情?

pat = re.compile(r'[^]{2}')