Добрый вечер.
Задача, есть некая таблица Крон, которая содержит подзадачи, которые нужно запускать последовательно. То есть после подзадачи 1 нужно запускать подзадачу 2, после подзадачи2 нужно подзадачу 3 и т.д.. Как правильно реализовать? Я бы еще хотела записывать дату старта подзадачи, стату успешного окончания подзадачи. Правильно ли я понимаю, что одним schedule тут не обойтись, нужен еще и job.
Если пробовать вручную прописывать список команд, без обращения к репозиторию, то все работает.
1. Прописала в Kernel.php
<?php
namespace App\Console;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
use App\Repositories\CronsRepository;
class Kernel extends ConsoleKernel
{
/**
* Create a new console kernel instance.
*
* @param \Illuminate\Contracts\Foundation\Application $app
* @param \Illuminate\Contracts\Events\Dispatcher $events
* @return void
*/
private $cronRepository;
public function __construct(Application $app, Dispatcher $events, CronsRepository $cronsRepository)
{
parent::__construct( $app, $events);
$this->cronRepository=$cronsRepository
}
/**
* Define the application's command schedule.
*/
protected function schedule(Schedule $schedule): void
{
$commands=$this->cronRepository->getActiveCommands();
foreach ($commands as $key=>$command){
if ($key>0){
$schedule->events()[0]->then(function($command) {
$this->call($command->command)
->withoutOverlapping()
});
}else {
$schedule
->command($command->command)
->cron($command->time)
->withoutOverlapping();
}
}
}
/**
* Register the commands for the application.
*/
protected function commands(): void
{
$this->load(__DIR__.'/Commands');
require base_path('routes/console.php');
}
}
Я даже пробовала в kernel.php прописывать
if (isset($commands[0])) {
$schedule
->command($commands[0]->command)
->cron($commands[0]->time)
->withoutOverlapping();
if (isset($commands[1])){
$schedule->events()[0]->then(function($commands) {
$this->call($commands[1]->command)
->withoutOverlapping();
});
}
}