Laravel Выбор Framework

grigori

( ͡° ͜ʖ ͡°)
Команда форума
ясно. чукча не читатель, чукча писатель, да еще и слепой

вызов автоинкремента делает $userRepository->create недетерминированным,
пол-темы обсуждается что "дергать" автоинкрементный генератор ID не надо
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Последнее редактирование:

Adelf

Administrator
Команда форума
со всякими CQRS это и так понятно почему. Человеку сложно понять зачем CQRS.

Я вот кстати чутьем чую, что вы правы. Получить Id - это даже по принципу Single Responsibility должна быть отдельная операция. Но проектов у меня таких не было. Поэтому с моей точки зрения - вас сложно понять. Поэтому типа "не обьяснили".
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а нельзя эту интересную тему подчистить от нечитателей? :)
 

stalxed

Новичок
PHP:
try {
  $user = $userRepository->create($req->getBody());
  $user->addPhone(...);
  $trx->commit();
  $res->redirect('profile', ['id' => $user->getId()]);
} catch (\Exception $e) {
  $trx->rollback();
  throw $e;
}
Что в этом коде недетерминированного, или неявного?
Смешиваются инфраструктурный слой(знание о реализации репозитория), domain слой(добавление телефона), и презентационный слой - редирект.
Данный код связывает вместе в кашу три разные слоя.
Для скорости разработки это большой плюс.
Минус для сохранения целостности domain слоя, так как логика domain слоя раскидана по многим actionам контроллеров(что является презентационным слоем).

Вся суть в том, чтобы сделать domain слой абсолютно голым(только простейшие php функции).
Я осознал кстати это тогда, когда покрыл domain слой unit тестами, моков было ОЧЕНЬ мало.
 
Последнее редактирование:

Redjik

Джедай-мастер
@grigori , @Вурдалак вы чот ребята перемудряете
http://martinfowler.com/bliki/CQRS.html

In particular CQRS should only be used on specific portions of a system (a Bounded Context in DDD lingo) and not the system as a whole. In this way of thinking, each Bounded Context needs its own decisions on how it should be modeled.
строить отношения товар-корзина, через cqrs глупо, ибо это один контекст и один домен

UPD. то есть пользоваться обычным CRUD для корзины, заказа и.т.п. норм вполне, а вот отдавать данные по заказам домену аналитики как раз через cqrs
 

Вурдалак

Продвинутый новичок
строить отношения товар-корзина, через cqrs глупо, ибо это один контекст и один домен
Фаулер утверждает следующее: CQRS — это сложно, применять нужно только в определённых контекстах. Ты говоришь: товар-корзина в одном контексте, поэтому CQRS тут применять глупо. Логика?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
@Redjik, у меня ощущение, что ты не прочел ни тему, ни статью, на которую ссылаешься. Фаулер говорит ровно противоположное:

CQRS нужно применять на специфических участках системы (в связанном контексте).
Каждый связанный контекст требует индивидуального решения как его смоделировать.

Утверждение
cqrs глупо, ибо это один контекст и один домен
противоречит словам Фаулера полностью.

Он предостерегает от overengineering, и напоминает, что mainstream - это CRUD, а разделять нужно на сложных участках.
The mainstream ... is a CRUD datastore.
As our needs become more sophisticated we steadily move away from that model.
... in more complicated domains, having the same conceptual model for commands and queries leads to a more complex model that does neither well.
Я в свою очередь начал с вопроса про список проблем, которые возникают, для определения сферы применимости. Если этих проблем нет - тебе это не нужно.
 
Последнее редактирование:

WMix

герр M:)ller
Партнер клуба
А можно глупый вопрос? На обычную корзину скажем из 3х таблиц, сколько моделей вы имеете? Меня не интересует функциональность и ответ типа в зависимости от... Больше среднее статистическое
 

stalxed

Новичок
Кстати часто, где применяется CQRS дальше следуют слова Event Sourcing.
В принципе для того же Billing Account - это ведь круто, все движения средств = следующие друг за другом события.
Но где можно увидеть код подобного на php? Это вообще реально? Ведь это порождает море проблем: 1 бд для чтения, 1 для изменений, синхронизация между ними, снапшоты, чтобы с нуля не читать весь агрегат, взаимодействие между агрегатами, etc.
 

WMix

герр M:)ller
Партнер клуба
Чтото путаешь, не? Одно дело накидать кучу запросов, другое на событие "покупка" приоритетно выступают обработчики, третье разделенная база, а тут вроде о избежании тормоза, изменением подхода, способом типа, "неожидание ответа на запись"
 
Последнее редактирование:

Redjik

Джедай-мастер
Ладно, на пальцах,

Пример номер раз:
пользователь ткнул добавит товар в корзину, отправился запрос, пришел ответ с сервера 204, js добавил товар в плашку с корзиной, нафига тут id?

Пример номер два:
кровь из носа нужно вернуть на клиент id?
ок, команда создает корзину и заказ, эвент обновляет вид через observer... ну или просто тупо оповещает тех, кого нужно оповестить (и да ... это не для веб приложения, это классическое десктопное mvc)

Пример номер три:
кровь из носа нужно вернуть на клиент id, да еще и в вебе?
ну так и делайте блин через контроллер, команда отработала, эвент запустился, контроллер вернул результат

https://github.com/qandidate-labs/broadway/blob/master/examples/command-handling/command-handling.php
намекну, то, что внизу, должно быть в контроллере ;)

Блин я же уже скидывал ссылку на бродвеев пару раз, или нет?
 

WMix

герр M:)ller
Партнер клуба
@Adelf, на лог намекаешь? я храню логом и движение средств и товаров, и на trigger after insert into лог считаю в кеш, но id записи все одно ожидаю.
 
Последнее редактирование:

Вурдалак

Продвинутый новичок

Вурдалак

Продвинутый новичок
пользователь ткнул добавит товар в корзину, отправился запрос, пришел ответ с сервера 204, js добавил товар в плашку с корзиной, нафига тут id?
Добавление товара в корзину — это не создание новой сущности. О каком id идёт речь?

Да видали уже такой подход, и я солидарен вот с этим чуваком: https://groups.google.com/forum/#!searchin/dddinphp/event$20controller/dddinphp/PoUdMKdqMuE/ZYZlpyrdwa4J
Во-первых, тупо выглядит хаком. $this->redirect() выбрасывает исключение шо ле?
Во-вторых, я не вижу ни одного кейса, вот кроме как с созданием новой сущности. Ради этого давать знать presentation о domain events? Мне эта идея не нравится.

И я не понял: это ты это «на пальцах» объяснял, что нафиг не нужно генерировать id до команды? AUTO_INCREMENT рулит? Серьезно?
PHP:
final class User
{
    public function register($id, UserName $name, Email $email, ...)
    {
        $user = new self(...);
        $user->record(new UserHasRegisteredEvent($this->id));
        $user->onModeration();

        return $user;
    }

    private function onModeration()
    {
        $this->status = Status::onModeration();
        $this->record(new UserHasBeenSentOnModerationEvent($this->id));
    }
}
Покажи аналог без $id, c AUTO_INCREMENT.
 
Последнее редактирование:

Вурдалак

Продвинутый новичок
Я почему не понял: сначала @Redjik говорит, что CQRS тут не нужен:
строить отношения товар-корзина, через cqrs глупо
Следующее его сообщение содержит информацию о том, как жить с CQRS без предварительной генерации id:
Ладно, на пальцах,
<...>
кровь из носа нужно вернуть на клиент id, да еще и в вебе?
ну так и делайте блин через контроллер, команда отработала, эвент запустился, контроллер вернул результат
Я запутался, @Redjik. Какой подход ты пытаешься защитить, что пытаешься донести?
 

Redjik

Джедай-мастер
Я почему не понял: сначала @Redjik
Я запутался, @Redjik. Какой подход ты пытаешься защитить, что пытаешься донести?
Никакой =) Я болею, не могу мысли нормально выразить =(((

И я не понял: это ты это «на пальцах» объяснял, что нафиг не нужно генерировать id до команды? AUTO_INCREMENT рулит? Серьезно?
Я нигде такого не говорил, мне нравится подход с генерацией uuid на клиенте, возможно, даже больше.

Покажи аналог без $id, c AUTO_INCREMENT.
так вон Матиаз показывает в той же ссылке (у него кстати классный доклад есть про CRUD головного мозга, найти?)
 
Сверху