Я думал, что так и будет разумно получить результаты БД в сообщении путем автоматического подключения Entity Manager
Код: Выделить всё
//src/Scheduler/Message/CheckReceiptStatus.php
namespace App\Scheduler\Message;
use App\Entity\OnlineReceipt;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\Common\Collections\Criteria;
class CheckReceiptStatus
{
public function __construct(
private EntityManagerInterface $entityManager,
) {}
public function getErroredReceipts()
{
$expressionBuilder = Criteria::expr();
$expression = $expressionBuilder->notIn('status', ['SUCCESS', 'ERROR']);
$receipts_with_no_status = $this->entityManager->getRepository(OnlineReceipt::class)->matching(new Criteria($expression));
return $receipts_with_no_status;
}
}
Код: Выделить всё
// src/Scheduler/Handler/CheckReceiptStatusHandler.php
namespace App\Scheduler\Handler;
use App\Scheduler\Message\CheckReceiptStatus;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
class CheckReceiptStatusHandler
{
public function __construct(
private readonly KernelInterface $kernel,
){}
public function __invoke(CheckReceiptStatus $status) : void
{
$path = $this->kernel->getProjectDir().'/var/log/cron_test.log';
file_put_contents($path, $status->getErroredReceipts(), FILE_APPEND);
}
}
Код: Выделить всё
// src/Scheduler/ReceiptTaskScheduler.php
namespace App\Scheduler;
use App\Scheduler\Message\CheckReceiptStatus;
use Symfony\Component\Scheduler\Attribute\AsSchedule;
use Symfony\Component\Scheduler\RecurringMessage;
use Symfony\Component\Scheduler\Schedule;
use Symfony\Component\Scheduler\ScheduleProviderInterface;
#[AsSchedule('default')]
class ReceiptTaskScheduler implements ScheduleProviderInterface
{
public function getSchedule(): Schedule
{
$schedule = new Schedule();
$schedule->add(RecurringMessage::every("20 seconds", new CheckReceiptStatus()));
return $schedule;
}
}
Подробнее здесь: https://stackoverflow.com/questions/790 ... se-queries