Создаем CQRS сервис с нуля: Spiral, Symfony Messenger и PHP Attributes | Полное руководство

Создаем CQRS сервис с нуля: Spiral, Symfony Messenger и PHP Attributes | Полное руководство

PHP Fart Time

6 месяцев назад

1,407 Просмотров

Ссылки и html тэги не поддерживаются


Комментарии:

@php-farttime
@php-farttime - 13.05.2024 23:55

Предлагайте идеи для будущих стримов

Ответить
@Chepurko87
@Chepurko87 - 17.05.2024 16:02

Спасибо огромное! Почерпнул для себя массу полезного!

Ответить
@ТанатАльпенов
@ТанатАльпенов - 18.05.2024 20:51

Мне кажется RegisterNewUserHandler, должен сам содержать ту логику, которую он делегирует другим командам. И не нужно тогда париться с транзакционной dispatchMany. Ну и можно юзать middleware doctrine_transaction, dispatch_after_bus.

Ответить
@АлександрРыков-ж4ы
@АлександрРыков-ж4ы - 23.05.2024 22:31

Было бы здорово иметь список мидлваров и возможность указывать, какие из них использовать для конкретной команды через атрибуты. #[middleware list [handler, validator]]

Ответить
@АлександрРыков-ж4ы
@АлександрРыков-ж4ы - 24.05.2024 04:06

Было бы проще заменить 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;
}
}
?> Эта мой пример

Ответить
@АлександрРыков-ж4ы
@АлександрРыков-ж4ы - 24.05.2024 04:50

Если создавать пакет CQRS (Command Query Responsibility Segregation), было бы здорово сделать так, чтобы мидлвары выносились в отдельные пакеты, как это реализовано в Tactician.

Ответить
@evgeny_5891
@evgeny_5891 - 07.07.2024 09:49

Пару вопросов по мат-части, что такое read model и write model, чем они отличаются, это разные базы?
Чем отличается CQS от CQRS?
Почему command ничего не может вернуть кроме айдишника, какую проблему это решает?

Ответить
@strandedinthe0737
@strandedinthe0737 - 15.08.2024 14:54

Ссылку на миро можно с материалами по DDD?)

Ответить