2
我正在阅读关于书籍DDD in PHP的预测,我很困惑何时何地从投影仪类中调用注册方法。PHP中的DDD - >投影机 - >何时何地应该调用投影机的注册方法?
Flow: 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);
}
}
}
}
你正在寻找的东西是pub/sub模式。 – Dariss
这些同步投影是? – plalx
@plalx是的,它是同步的 –