injectableFactory = $injectableFactory; $this->entityManager = $entityManager; $this->config = $config; $this->log = $log; } public function run(): void { $dt = new DateTime(); $now = $dt->format('Y-m-d H:i:s'); $nowShifted = $dt->sub(new DateInterval('PT1H'))->format('Y-m-d H:i:s'); $maxPortionSize = $this->config->get('emailReminderPortionSize') ?? self::MAX_PORTION_SIZE; $collection = $this->entityManager ->getRDBRepository('Reminder') ->where([ 'type' => 'Email', 'remindAt<=' => $now, 'startAt>' => $nowShifted, ]) ->limit(0, $maxPortionSize) ->find(); if (is_countable($collection) && count($collection) === 0) { return; } $emailReminder = $this->injectableFactory->create(EmailReminder::class); foreach ($collection as $entity) { try { $emailReminder->send($entity); } catch (Throwable $e) { $this->log->error( "Email reminder '{$entity->getId()}': " . $e->getMessage() ); } $this->entityManager ->getRDBRepository('Reminder') ->deleteFromDb($entity->getId()); } } }