Комментарии:
Предлагайте идеи для будущих стримов
ОтветитьСпасибо огромное! Почерпнул для себя массу полезного!
ОтветитьМне кажется RegisterNewUserHandler, должен сам содержать ту логику, которую он делегирует другим командам. И не нужно тогда париться с транзакционной dispatchMany. Ну и можно юзать middleware doctrine_transaction, dispatch_after_bus.
ОтветитьБыло бы здорово иметь список мидлваров и возможность указывать, какие из них использовать для конкретной команды через атрибуты. #[middleware list [handler, validator]]
ОтветитьБыло бы проще заменить dispatchMany на middlewareEvent, который по имени команды подключает соответствующие мидлвары, а затем запускает их. <?php
class MiddlewareEvent {
private $container;
private $classNameInflector;
private $eventDispatcher;
private $eventRecorder;
public function __construct($container, $classNameInflector, $eventDispatcher, $eventRecorder) {
$container->container = $container;
$this->classNameInflector = $classNameInflector;
$this->eventDispatcher = $eventDispatcher;
$this->eventRecorder = $eventRecorder;
}
public function execute(object $message, callable $next): mixed {
$messageClassName = get_class($message);
$listenerAggregate = $this->container->get($this->classNameInflector->getClassName($messageClassName));
$listenerAggregate->attach($this->eventDispatcher->getEventManager());
try {
$result = $next($message);
} catch (\Exception $exception) {
$this->eventRecorder->eraseEvents();
$listenerAggregate->detach($this->eventDispatcher->getEventManager());
throw $exception;
}
// Получили все события.
$recordedEvents = $this->eventRecorder->releaseEvents();
foreach ($recordedEvents as $event) {
$this->eventDispatcher->onDispatch($event, $message);
}
$listenerAggregate->detach($this->eventDispatcher->getEventManager());
return $result;
}
}
?> Эта мой пример
Если создавать пакет CQRS (Command Query Responsibility Segregation), было бы здорово сделать так, чтобы мидлвары выносились в отдельные пакеты, как это реализовано в Tactician.
ОтветитьПару вопросов по мат-части, что такое read model и write model, чем они отличаются, это разные базы?
Чем отличается CQS от CQRS?
Почему command ничего не может вернуть кроме айдишника, какую проблему это решает?
Ссылку на миро можно с материалами по DDD?)
Ответить