Introduce subject entry to carry subject & payload data
[MAILPOET-4629]
This commit is contained in:
@@ -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<Subject<Payload>>[]
|
||||
*/
|
||||
public function getSubjectsEntries(array $subjectData): array {
|
||||
$subjectEntries = [];
|
||||
foreach ($subjectData as $data) {
|
||||
$subjectEntries[] = $this->getSubjectEntry($data);
|
||||
}
|
||||
return $subjectEntries;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param SubjectData $subjectData
|
||||
* @return SubjectEntry<Subject<Payload>>
|
||||
*/
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
49
mailpoet/lib/Automation/Engine/Data/SubjectEntry.php
Normal file
49
mailpoet/lib/Automation/Engine/Data/SubjectEntry.php
Normal file
@@ -0,0 +1,49 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\Automation\Engine\Data;
|
||||
|
||||
use MailPoet\Automation\Engine\Data\Subject as SubjectData;
|
||||
use MailPoet\Automation\Engine\Exceptions;
|
||||
use MailPoet\Automation\Engine\Workflows\Payload;
|
||||
use MailPoet\Automation\Engine\Workflows\Subject;
|
||||
use Throwable;
|
||||
|
||||
/**
|
||||
* @template-covariant S of Subject<Payload>
|
||||
*/
|
||||
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;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user