diff --git a/mailpoet/lib/Automation/Engine/Control/SubjectLoader.php b/mailpoet/lib/Automation/Engine/Control/SubjectLoader.php index 046f1d7804..623294d547 100644 --- a/mailpoet/lib/Automation/Engine/Control/SubjectLoader.php +++ b/mailpoet/lib/Automation/Engine/Control/SubjectLoader.php @@ -2,10 +2,12 @@ namespace MailPoet\Automation\Engine\Control; +use MailPoet\Automation\Engine\Data\Subject as SubjectData; +use MailPoet\Automation\Engine\Data\SubjectEntry; use MailPoet\Automation\Engine\Exceptions; use MailPoet\Automation\Engine\Registry; +use MailPoet\Automation\Engine\Workflows\Payload; use MailPoet\Automation\Engine\Workflows\Subject; -use Throwable; class SubjectLoader { /** @var Registry */ @@ -17,17 +19,28 @@ class SubjectLoader { $this->registry = $registry; } - public function loadSubject(string $key, array $args): Subject { + /** + * @param SubjectData[] $subjectData + * @return SubjectEntry>[] + */ + public function getSubjectsEntries(array $subjectData): array { + $subjectEntries = []; + foreach ($subjectData as $data) { + $subjectEntries[] = $this->getSubjectEntry($data); + } + return $subjectEntries; + } + + /** + * @param SubjectData $subjectData + * @return SubjectEntry> + */ + public function getSubjectEntry(SubjectData $subjectData): SubjectEntry { + $key = $subjectData->getKey(); $subject = $this->registry->getSubject($key); if (!$subject) { throw Exceptions::subjectNotFound($key); } - - try { - $subject->load($args); - } catch (Throwable $e) { - throw Exceptions::subjectLoadFailed($key, $args); - } - return $subject; + return new SubjectEntry($subject, $subjectData); } } diff --git a/mailpoet/lib/Automation/Engine/Data/SubjectEntry.php b/mailpoet/lib/Automation/Engine/Data/SubjectEntry.php new file mode 100644 index 0000000000..1d4ab4be1f --- /dev/null +++ b/mailpoet/lib/Automation/Engine/Data/SubjectEntry.php @@ -0,0 +1,49 @@ + + */ +class SubjectEntry { + /** @var S */ + private $subject; + + /** @var SubjectData */ + private $subjectData; + + /** @var Payload|null */ + private $payloadCache; + + /** @param S $subject */ + public function __construct( + Subject $subject, + SubjectData $subjectData + ) { + $this->subject = $subject; + $this->subjectData = $subjectData; + } + + /** @return S */ + public function getSubject(): Subject { + return $this->subject; + } + + /** @return Payload */ + public function getPayload() { + if ($this->payloadCache === null) { + try { + $this->payloadCache = $this->subject->getPayload($this->subjectData); + } catch (Throwable $e) { + throw Exceptions::subjectLoadFailed($this->subject->getKey(), $this->subjectData->getArgs()); + } + } + return $this->payloadCache; + } +}