Artemiy
19.09.2017
16:23:58
осталось разобраться как лучше транзакцию использовать в сервисе
если очень надо
Sergey
19.09.2017
16:24:24
Google
Sergey
19.09.2017
16:24:42
брать entitymanager, но завести конвенцию в команде, что кроме как для flush/persist/getReference его не юзать
можно еще сделать свой интерфейс
и проксировать
Artemiy
19.09.2017
16:25:09
Sergey
19.09.2017
16:25:13
Sergey
19.09.2017
16:25:42
когда он закрывается, его переоткрыть нельзя
и беда тогда
Sergey
19.09.2017
16:25:56
которому можно делать ресет
Sergey
19.09.2017
16:26:37
есть более элегантный способ
Sergey
19.09.2017
16:26:56
Google
Artemiy
19.09.2017
16:27:35
Sergey
19.09.2017
16:27:38
поведаешь?
https://blog.fervo.se/blog/2017/07/06/doctrine-repositories-autowiring/
пхать registry manager и из него получать em
Artemiy
19.09.2017
16:27:52
Я даже не думал разделять просто персист и флуш
Sergey
19.09.2017
16:28:16
ну не, в целом норм
Artemiy
19.09.2017
16:30:56
Sergey
19.09.2017
16:31:30
Artemiy
19.09.2017
16:32:10
ну я так понял мне надо разделить его на два метода
Sergey
19.09.2017
16:39:11
ну разве что это контроллер
тогда ок
Sergey
19.09.2017
16:40:10
уже был срач на эту тему
Artemiy
19.09.2017
16:40:33
Это репозиторий
А почему не ок?
Sergey
19.09.2017
16:47:47
задача репозитория - хранить. Создавать - не его задача. И уж тем более это не то место где известно что это конец бизнес транзакции, следовательно делать flush там не стоит.
иначе придется потом это учитывать если надо будет создать еще раз эту сущность
по хорошему в репозитории у тебя должно быть что-то такое:
public function add(SomeEntity $entity): void
{
$this->em->persist($entity);
}
Google
Sergey
19.09.2017
16:49:44
никаких save
Sergey
19.09.2017
16:50:13
транзакция может быть вложенной, так что ок
и он может уметь делать save
окрамиус это подтвердил кстати
и так в c# и хибер репосах тоже
Sergey
19.09.2017
16:51:14
у меня репосы не должны уметь делать save
Artemiy
19.09.2017
16:51:32
Sergey
19.09.2017
16:51:40
так что не, спасибо
Ок, как тогда делать флуш? Без em
флуш должен быть не в репозитории, он должен быть в контроллерах или где-то где ты можешь четко обозначить гнраницу бизнес транзакции.
можешь завернуть em в сервис который только и умеет что флашить, ну или опять же нет ничего плохого в том что бы флашнуть в контроллере
Artemiy
19.09.2017
16:53:10
Я предполагал делать в сервисе, скорее заверну в сервис em
Спасибо большое!
Sergey
19.09.2017
16:53:28
и так в c# и хибер репосах тоже
по факту надо просто определиться о контексте, если тебе "репозитории" нужны только как некий гейтвей и мэппер - то это одно.
но что-то мне подсказывает что нет)
но если у тебя тупой CRUD - то даже хз
Artemiy
19.09.2017
16:55:04
Каждый экшен работает со своим сервисом
Каждый контроллер
Google
Sergey
19.09.2017
17:00:50
так экшен или контроллер?
что делают сервисы? как они называются например
зачем они?)
зачем мы?
Artemiy
19.09.2017
17:03:16
Например есть сервис у юзера, там есть метод create, invite
Самое примитивное
Dmitriy
19.09.2017
17:06:21
А если создавать отдельный класс на каждый юзкейс?
Например CreateUser
Sergey
19.09.2017
17:06:42
да здравствуют команды?)
Dmitriy
19.09.2017
17:06:48
А он уже в экшн инжектится
типа createAction(CreateUser $useCase)
ну команды там же типа шина команд
а тут просто класс
Dmitry
19.09.2017
17:09:03
если у нас правильно выбран aggregate root, то флаш может быть и в репозитории
Sergey
19.09.2017
17:09:56
флаш в репозитории несет больше рисков чем флаш в контроллере. Так же это проще с точки зрения вариантов "как можно сделать не так"
я не спорю что можно если все делать правильно, но делать правильно сложно
и не все умеют (я вот не могу сказать что умею выбирать корни агрегатов правильно, как минимум не с первого раза)
Dmitry
19.09.2017
17:11:51
а если у нас никак не получается с aggregate root, то, есть uow. Можно его или из репозитория дергать или вообще отдельно инжектировать в сервис конкретную реализацию uow для сервиса
Google
Dmitry
19.09.2017
17:12:59
когда в uow мы говорим commit мы завершаем логическую транзакцию... ну а реализация делает уже транзакцию в базе
Sergey
19.09.2017
17:13:29
я не понимаю желание запихнуть flush в репозиторий
зачем...
ему там не место
просто даже исходя из сфер ответственности
ну или во всяком случае в том виде в котором это реализовано в доктрине
Dmitry
19.09.2017
17:14:24
м... flush - это commit встроенного в доктрину uow
Sergey
19.09.2017
17:14:33
и там uow по сути глобальный
он никак не изолирован в контексте запроса.
что делает работу с flush дико неудобной.
Dmitry
19.09.2017
17:15:49
ну да, по-этому и и говорю, что нужно писать свои реализации uow и их инжектить в сервис.... а они уже на commit будут делать пачку персистов и flush
Sergey
19.09.2017
17:17:00
Dmitry
19.09.2017
17:17:04
flush в контроллере - это просто, конечно, но до момента, пока тебе не понадобися вложенные транзакции... да и вообще не нравится такой вот вызов чисто persistance ответственности из приложения... хотя и не протеворечит, да
Sergey
19.09.2017
17:17:17
у меня терпения не хватило свой uow писать хоть у меня и была довольно простая задача
ну то есть это тебя ни в чем не ограничивает
Dmitry
19.09.2017
17:18:34
ну у меня нет примеров... я тут погуглил.. ну все кто в лес, кто по дрова... кто-то в репозиторий втфкает его, кто-то вообще сократил uow до трех методов: begin / commit / rollback и инжектит его в сервис (тира uow->begin, repo->add, uow->commit)
Sergey
19.09.2017
17:19:05
но у меня пока не попадалось задач где нужны вложенные транзакции
как-то обходилось... есть задачи где одна бизнес транзакция инициирует цепочку доменных событий, которые инициируют свои бизнес транзакции но там не нужно было откатывать все если что-то не удалось
просто разные контексты