Планировщик Symfony — где мне выполнять запросы к базе данныхPhp

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Планировщик Symfony — где мне выполнять запросы к базе данных

Сообщение Anonymous »

Я пытаюсь избежать cron и выполнять работу с помощью планировщика Symfony. Я почти у цели (проверял запись текста в файл каждые 20 секунд), но мне трудно понять, куда помещать запросы к базе данных.
Я думал, что так и будет разумно получить результаты БД в сообщении путем автоматического подключения 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);
}
}
Однако я вижу сообщение об ошибке в коде планировщика, в котором говорится, что новый CheckReceiptStatus() ожидает 1 аргумент.

Код: Выделить всё

// 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»