Ты рассматриваешь нарушение этого принципа на уровне метода nextval(). Но на это нарушение всем пофиг. Мы же сейчас говорим про нарушение на уровне сервисов. Здесь это гораздо принципиальнее.nextval() в Postgres - точно такое же нарушение CQS, как и любая increment-and-return функция - в memcached, shared memory, etc
Причем тут CQRS и асинхронность? id ты можешь получить из какого-то специального сервиса перед выполнением команды регистрации.А если вернуться как раз к такому типичнейшему действию как регистрация.
1) Пользователь ввел login, email, password.
2) Команду можем делать только синхронной, пользователю нужен ответ.
3) Отправляем сервису login, email, password - получаем id...
У нас уже не CQRS.
А что тут дикого?На клиенте генерировать ID это уже имхо дико.
Вот тут не понял, а каким образом, при любом подходе, можно создать зависимую сущность, пока не существует той сущности от которой она зависит?значит, проблема сводится к такой проектировке системы, чтобы сущности, которые генерируют autoincrement id при создании, были созданы до зависимых сущностей
условно, запись для товара должна быть создана до генерации сущностей свойств этого товара
для restful микросервисов оказалось самое оно, уже 10ок сущностей и все ключи uuid, полет нормальныйМеня смущает, что на практике скорее всего придётся использовать и числовой (для FK, для производительности, для human readablity, etc.) и UUID одновременно.
Речь про объекты в процессе исполнения. Например, пришел запрос на создание заказа товара, идет его валидация и обработкаВот тут не понял, а каким образом, при любом подходе, можно создать зависимую сущность, пока не существует той сущности от которой она зависит?
$Order = new Order();
$Basket = new Basket($_REQUEST['basket']);
if ($Basket->isValid()){
$Order->save();
$Basket->setOrderId($Order->getId());
$Basket->save();
}
$Order = new Order($id);
$Order->addProductsToBasket($_Request);
$Order->save();
echo $Order->resultStatus();
Хм, интересно:Причем тут CQRS и асинхронность? id ты можешь получить из какого-то специального сервиса перед выполнением команды регистрации.
А что тут дикого?
try {
$idGen = new \Infrastructure\IdGenerator();
$id = $idGen->generate();
$service = new \Application\CreateUserService();
$service->create(new \Application\CreateUserCommand($id, $_POST['username'], $_POST['password'], $_POST['email']));
header('Location: http://domain.com/user/profile/'. $id);
} catch (\Exception $e) {
http_response_code(500);
}
Прочти тему?оО а чем вы оправдываете такую жесть, против вот этого:
PHP:$user = $userRepository->create($req->getBody()); $res->redirect('profile', ['id' => $user->getId()]);
Ну, у нас же реляционная база? Транзакции@hell0w0rd, добавь в свой код создание пары сущностей типа UserPhones и отказ от создания пользователя если телефоны не прошли валидацию
невозможно. Типичный CRUD-подход.PHP:$user = $userRepository->create($req->getBody()); $res->redirect('profile', ['id' => $user->getId()]);
а теперь осознай что тразакции тебе нужны только для того чтобы добраться для генератора уникальных ID,Транзакции
только во втором случае действия описаны явно, а откат транзакции - неявные операции, что намного хужеtry {
$idGen = new \Infrastructure\IdGenerator();
$id = $idGen->generate();
Почему неявные? У СУБД, на сколько я знаю, написан механизм, если свет моргнул во время транзакции, как-то с ней разобраться. А что будет если твой такой код упадет?только во втором случае действия описаны явно, а откат транзакции - неявные операции, что намного хуже
Ну то есть все к реюзабельному коду сводится? Мне реюзабельность понадобилась пару раз, и о ней обычно, если не известно, то можно догадаться заранее. А если потом понадобилось - то можно и порефакторить....проблемам реюзабельности кода...
Нет, всё сводится к точному понимаю бизнес-требований и отсутствию двойного толкования. Ты сейчас хочешь поговорить на тему «а зачем нужен DDD, мне и так хорошо»?Ну то есть все к реюзабельному коду сводится?
try {
$user = $userRepository->create($req->getBody());
$user->addPhone(...);
$trx->commit();
$res->redirect('profile', ['id' => $user->getId()]);
} catch (\Exception $e) {
$trx->rollback();
throw $e;
}