Как правильно менять состояние агрегата из другого домена/модуля?
Вопрос не правильно сформулирован и не актуален
Дополнительно:
" Поэтому, можете подсказать, в данной ситуации это должно выглядить как событие которое инициализирует изменение или событие которое происходит после изменения?"
Как событие которое происходит после изменения.
т.е. вы меняете свой агрегат, и потом в диспетчер кидаете событие о том что в агрегате произошло. со всеми данными.
"ибо я понимаю что один модуль не должен знать о другом"
с точки зрения ддд и именно событий - может. но модули не то чтобы знают друг о друге. они просто реагируют на события и данные в них, которые приходят из неизвестной части системы.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для изменения состояния агрегата из другого домена или модуля вам следует использовать паттерн проектирования "Наблюдатель" (Observer). Этот паттерн позволяет объектам оповещать другие объекты о своем изменении состояния, не зная при этом ничего о них.
Для использования паттерна "Наблюдатель" вам необходимо создать интерфейс Subject (Субъект) и интерфейс Observer (Наблюдатель). Класс агрегата будет реализовывать интерфейс Subject, а классы, которые хотят получать уведомления об изменениях состояния агрегата, будут реализовывать интерфейс Observer.
Пример реализации паттерна "Наблюдатель" на PHP:
interface Subject {public function attach(Observer $observer);
public function detach(Observer $observer);
public function notify();
}
interface Observer {
public function update();
}
class Aggregate implements Subject {
private $observers = [];
public function attach(Observer $observer) {
$this->observers[] = $observer;
}
public function detach(Observer $observer) {
$key = array_search($observer, $this->observers);
if ($key !== false) {
unset($this->observers[$key]);
}
}
public function notify() {
foreach ($this->observers as $observer) {
$observer->update();
}
}
// Метод, который меняет состояние агрегата и оповещает наблюдателей
public function changeState() {
// Изменение состояния агрегата
// Оповещение наблюдателей
$this->notify();
}
}
class ObserverA implements Observer {
public function update() {
echo "Observer A has been notified