Я сейчас читаю о прогнозах из книги DDD в PHP и я запутался, когда и где вызывать метод register из класса проектора.
Поток: CreateNewTaskRequest -> CreateNewTaskService -> Task :: writeFromNew () -> PDOTaskRepository.
В конце метода сохранения в PDOTaskRepository вызывается метод проекта проектора, который, в свою очередь, вызывает метод проекта всех зарегистрированных проекций, которые прослушивают события данного домена.
Но где и когда мне регистрировать проекции на проектор?
class PDOTaskRepository implements TaskRepository
{
private $projector;
public function __construct(Projector $projector)
{
$this->projector = $projector;
}
public function save(Task $task)
{
// Code to save in DB$this->projector->project($task->recordedEvents());
}
}class Projector
{
/**
* @var Projection[]
*/
private $projections = [];/**
* @param Projection[] $projections
*/
public function register(array $projections)
{
foreach ($projections as $projection) {
$this->projections[$projection->listensTo()] = $projection;
}
}
public function project(array $events)
{
foreach ($events as $event) {
if (isset($this->projections[get_class($event)])) {
$this->projections[get_class($event)]->project($event);
}
}
}
}
Есть множество способов сделать это. Однако, учитывая, что ваш Projector
класс не является потокобезопасным, вы должны сделать это где-то нет споров. Я бы сделал это в Корень композиции моего приложения, прямо или косвенно, используя крюк запуска приложения, если таковой имеется.
Кроме того, чтобы минимизировать риск злоупотребления register
функция Projector
Я, вероятно, просто передам все прогнозы при построении Projector
учебный класс. Это исключает риск звонка register
в более позднее время возможно создание разногласий с продолжающимся project
операция.
Других решений пока нет …