Size: a a a

2021 September 01

ПГ

Павел Г. in symfony
Я короче не силен в этом, но в целом:
1) Такие операции не про агрегаты а про какие то RAW данные
2) Если по теории агрегатов - то значит конпенсация какая то.
Если бы на другой стороне был микросервис, как мы реализовали бы такую "транзакцию" ?
источник

КГ

Константин Грачев... in symfony
Нафига усложнять там где это не нужно?
Когда у тебя агрегат уже создан и ты с ним какие то операции совершаешь то ты всё верно пишешь. Но в приложении и другие операции существуют, как та же загрузка экселя например, где "агрегат" это запись о загруженном экселе
источник

КГ

Константин Грачев... in symfony
Это класс который декларирует news.read метод в json-rpc api. При вызове которого news помечается прочитанным.

Сущность приходит сразу в __invoke от ArgumentResolver'a, коммит происходит в мидлваре.

Можно было конечно сделать коллекцию с интерфейсом, вызвать news::get(id) в методе, но нахуа?)
источник

КГ

Константин Грачев... in symfony
Аргумент резолвер примитиный, агрится на наличие атрибута Entity перед аргументом, класс берётся из typehint'a
источник

AM

Artem Molotov in symfony
А резолвер сущность откуда берёт, кстати? Из того упомянутого ManagerRegistry?
источник

AM

Artem Molotov in symfony
Или просто создаёт её как новую (вроде нет)?
источник

КГ

Константин Грачев... in symfony
да, достаётся EM по классу сущности, и get либо find если параметр nullable
источник

КГ

Константин Грачев... in symfony
get у меня искючение кидает если сущности нет
источник

AM

Artem Molotov in symfony
а, сразу ем. Ну если там других реализаций (не бд) не будет, то норм.
источник

✨Basic_Instinct✨ in symfony
а для чего здесь явная транзакция? если flush и так все оборачивает в тарнзакцию?
источник

КГ

Константин Грачев... in symfony
Я перед тестами наполняю базу фикстурами, после каждого теста делается rollaback. Писать тесты с подменой репозиториев на in memory мне кажется чем то излишним. Может недорос ещё, хз)
источник

AM

Artem Molotov in symfony
Флеш оборачивает в транзакцию только то, что было вызвано до предыдущего вызова флеша. Если мы в каждый cud метод добавляем флеш, то тогда после каждого добавления будет флеш и это медленно + возможны ошибки бизнес логики. Для этого сверху ещё транзакция и нужна, если там планируется не одна операция
источник

AM

Artem Molotov in symfony
Репы не столь для тестов нужны, как для именно прода, после указки: "так, ребят, вот эта херня из бд выпиливается, теперь будем получать её из сервиса по ком-порту". В пхп такое редкость, кажется
источник

КГ

Константин Грачев... in symfony
Тут наверное вопрос не в пхп, а в мамкиных микросервисовписателях
источник

АС

Александр Семикашев... in symfony
Я может что-то не понял. Ну если ты вызвал flush в конце, то по времени будет всё тоже самое или нет?
источник

AM

Artem Molotov in symfony
Ну и это тоже. Справедливости ради, иногда выбора нет. Надо бы пойти в медицину работать. Может бы попал на такое (в целом мне такая тематика интересна)
источник

AM

Artem Molotov in symfony
А как ты планируешь "в конце" флеш вызывать?
источник

АС

Александр Семикашев... in symfony
Ну ты написал что "если мы в каждый cud метод добавляем флеш, то тогда после каждого добавления будет флеш и это медленно" сделал вывод что когда-то вы его вызываете... хотя может суть проблемы не понял
источник

АВ

Алексей Велосипедкин... in symfony
Один агрегат в одну транзакцию, потому как с другого импорта может прийти такой же и будет дубликейт кей
источник

AM

Artem Molotov in symfony
foreach ($some as $another) {
   if ($what) {
       $repo->add($another);
   }
}

Если не оборачивать такое в транзакцию, то после каждого вызова add будет добавление в БД = тормоза.

С другой стороны, если в add нет flush, то не будет лишней работы UoW. Но если забыть потом заюзать внешний флешер, то данные вообще пропадут. В итоге решил, что флеш должен быть в cud методах + сверху ещё одна транзакция. Будет лишний раз гоняться UoW, но ничего не забудем и будет относительно быстро.

+ ещё может понадобиться делать $em->clear(),  если данных очень много, и вот тут уже кроме транзакции может понадобиться и внешний флешер... В итоге между этими кейсами и болтаюсь.
источник