Алексей
А вы что, трайкетчите в каждом контроллере?
есть exception handler, но не все покрывает. я хочу составить список всех exception которые не покрыты
Павел
есть exception handler, но не все покрывает. я хочу составить список всех exception которые не покрыты
ну просто получается нужен линтер, который анализирует именно ваш хандлер и все исключения в приложении
Михаил
Здарова ребят, как жизнь? Такой вопрос, я получаю сущность из удалённого сервера $user = $this->httpClient->execute(new GetUserRequest(id: 123)); Я хочу его добавить в entity manager, но проблема в том, что Doctrine считает такие сущности новыми и планирует insert. Соответственно если я сделаю: $this->em->persist($user); // какой-то случайный код, 100 сменяемых контекстов и 100500 строчек спустя... $this->em->flush(); То доктрина попытается вставить этого юзера. Как мне добавить юзера в em, что бы она не считала его новым (ну и update не планировала тоже)
Павел
Вообще можно поковыряться в публичных методах UoW и добавить что то самому в отслеживание, но это больше хак
Михаил
Я не контролирую последующие flush. И я не могу его убрать, так как допустим я хочу использовать этого юзера в дальнейшем как подсущность, допустим $order = Order::create(amount: 322, customer: $user /* user из http */); $this->em->persist($order); $this->em->flush(); // и вот тут всё накроется песцом - так как user нет в Identity Map
Михаил
Вообще можно поковыряться в публичных методах UoW и добавить что то самому в отслеживание, но это больше хак
не ну я то могу и в приватных методах поковыраться $callback = function () { $this->veryVeryPrivateEmMethod(); $this->scheduleForInsert = []; $this->scheduleForInsert = []; } $callback->call($this->em); Но тогда я буду ОООЧЕНЬ грязным мальчиком
Павел
Что вообще за флоу, что сущность прилетает из http? Из http прилетают данные а не сущность
Михаил
Чтобы нормаьно работать, надо доставать из БД сущности. Есть еще всякие attach merge, но вроде что то из этого деприкейтнули
так и есть, но к сожалению это проблема оптимизации. Очень горячий кусок кода, и не хочу базу данных нагружать. Про http клиент я соврал, я немного из другого места достаю пользака, но это не важно. Короче мой Goal - сохранить баланс между производительностью и изящностью кода. Доктрина это второе, но к сожалению не первое (в моём случае)
Михаил
Что вообще за флоу, что сущность прилетает из http? Из http прилетают данные а не сущность
это неважные детали, к сожалению так нужно делать. или вообще НЕ использовать доктрину в этом куске кода
Сергей
Для чего сущность пользователя нужна? Чтобы заказ создать?
Павел
Ну кстати если нужно просто связь а не целый юзер, то можно референс использовать
Михаил
Для чего сущность пользователя нужна? Чтобы заказ создать?
ну допустим. Я понимаю к чему вы, можно просто указать userId - но там не всё так просто
Павел
а подробнее? Это что то типо прокси?
Да, создать прокси который можно использовать в связях без реального запроса в БД
Павел
а подробнее? Это что то типо прокси?
https://stackoverflow.com/questions/24181530/doctrine-2-can-i-get-a-reference-from-a-repository-instead-of-from-the-entity-m в эту сторону гуглить
Павел
https://www.doctrine-project.org/projects/doctrine-orm/en/2.16/reference/advanced-configuration.html#reference-proxies
Михаил
Да, создать прокси который можно использовать в связях без реального запроса в БД
Крутая идея, но получается это просто ссылка, а не настоящий объект с данными. То есть я запросил с сервера данные, превратил их в объект с id, c именем фамилией, возрастом - но я не могу воспользоваться данными, а только использовать как ссылку. И на сколько я понимаю, как только кто-то попытается получить поле этого объекта - прокси инициализируется и сделает реальный запрос?
Павел
А не, в доке написано, что будет инициализация
Михаил
Спасибо. Ну если что, обмануть проксю - как отнять ребёнка у конфеты
The Ant
И вообще сомневаюсь, что 1 селект как-то повлияет на производительность. Я понимаю там запись оптимизировать... Чтение с джойнами или сложные фильтры. Но запрос с ПК без лишних условий? Чёт хрень какая-то
The Ant
К тому же сбегать за юзером по хттп, и при этом сцать какого то селекта. Дядь, ты нам чёт голову морочишь )
Михаил
а зачем персистить сущность в тот сторадж, в котором его не должно быть?
как это не должно, когда должно? Если вы не знаете как решить проблему, ок, без проблем. Если я не найду ответ, я просто сделаю данный юнит чистым sql или ещё как нибудь. Но не надо говорить что я делаю что-то не правильно. Вопрос был не в этом.
Михаил
если сущность живёт в репозитарии, у которой под капотом хттп клиент, то она явно не должна попадать в доктрину
А если сущность синхронизируется с внешним ресурсом? Допустим я получаю её веб хуками, так же веб хуками получаю события по этим сущностям, где эти сущности так же присутствуют Ну допустим {"message":"foo bar", "recipient": {"this is": "user object"}} Дальше не важно, из -за внутреннего рассинхрона или из-за рассинхрона в отправке хуков внешней системой я получаю хук о событии о новом пользаке РАНЬШЕ чем придёт хук о новом пользаке. То есть этот пользак и так скоро станет частью моей бд, у меня есть допуски по тому, сколько каждая сущность может быть рассинхронизированнной, но также есть допуске по тому, за сколько я должен обработать предположем 8 000 000 ивентов. Если я прям в этом ивенте сделать insert, без шуток, это может увеличить время обработки вдвое. Для меня это непозволительная роскошь. И при этом я хочу продолжить работать с доктриной и в объектно ориентированность виде с бд. Ещё раз говорю, не надо решать не ту проблему, которую я поставил. ну и да, вы мне ничем не обязаны, это естественно
Иван
это немножко другая постановка вопроса как добиться, чтобы события долетали по порядку
Павел
А если сущность синхронизируется с внешним ресурсом? Допустим я получаю её веб хуками, так же веб хуками получаю события по этим сущностям, где эти сущности так же присутствуют Ну допустим {"message":"foo bar", "recipient": {"this is": "user object"}} Дальше не важно, из -за внутреннего рассинхрона или из-за рассинхрона в отправке хуков внешней системой я получаю хук о событии о новом пользаке РАНЬШЕ чем придёт хук о новом пользаке. То есть этот пользак и так скоро станет частью моей бд, у меня есть допуски по тому, сколько каждая сущность может быть рассинхронизированнной, но также есть допуске по тому, за сколько я должен обработать предположем 8 000 000 ивентов. Если я прям в этом ивенте сделать insert, без шуток, это может увеличить время обработки вдвое. Для меня это непозволительная роскошь. И при этом я хочу продолжить работать с доктриной и в объектно ориентированность виде с бд. Ещё раз говорю, не надо решать не ту проблему, которую я поставил. ну и да, вы мне ничем не обязаны, это естественно
Ещё раз перечитал старт топик, такое ощущение что вы хотите использовать в сущности B сущность А, как будто А настоящая, но не хотите получать её из бд, а только её данные, так как получили их из хука, ивента
Павел
А если сущность синхронизируется с внешним ресурсом? Допустим я получаю её веб хуками, так же веб хуками получаю события по этим сущностям, где эти сущности так же присутствуют Ну допустим {"message":"foo bar", "recipient": {"this is": "user object"}} Дальше не важно, из -за внутреннего рассинхрона или из-за рассинхрона в отправке хуков внешней системой я получаю хук о событии о новом пользаке РАНЬШЕ чем придёт хук о новом пользаке. То есть этот пользак и так скоро станет частью моей бд, у меня есть допуски по тому, сколько каждая сущность может быть рассинхронизированнной, но также есть допуске по тому, за сколько я должен обработать предположем 8 000 000 ивентов. Если я прям в этом ивенте сделать insert, без шуток, это может увеличить время обработки вдвое. Для меня это непозволительная роскошь. И при этом я хочу продолжить работать с доктриной и в объектно ориентированность виде с бд. Ещё раз говорю, не надо решать не ту проблему, которую я поставил. ну и да, вы мне ничем не обязаны, это естественно
Просто когда костыли идут в бой, очень часто выбран именно неверный подход к решению задачи, и вам пытаются помочь в этом, пытаясь изначально понять задачу и проблему.
Павел
Совершенно верно
Может тогда вариант работать не с сущностью А а с абстракцией/DTO которую собирать из Хука/Сущности?
Михаил
Просто когда костыли идут в бой, очень часто выбран именно неверный подход к решению задачи, и вам пытаются помочь в этом, пытаясь изначально понять задачу и проблему.
Рассинхронизация - не совсем костыль. Скажем так хочу только в одном кейсе немного изменить правила игры. Но когда сущность досинхронизируется - честное пионерское, буду играть по правилам
Павел
$EntityB->action(Dto::createFromHook($hook)) $EntityB->action(Dto::createFromEntity($EntityA)) Ну это чисто пример
Павел
Зачем вам обязательно сущность, если она потом даже в БД не летит?
Михаил
Зачем вам обязательно сущность, если она потом даже в БД не летит?
Вот именно, что потом она летит в бд и между двумя сущностями устанавливается связь. Но в обратном порядке. Сложно ребят, если я буду говорить про устройство домена и про конкретно мой кейс - это как минимум нарушение nda
Михаил
Ладно, давайте закроем тему. Я понял, через доктрину делать так нельзя, нужно делать по другому. Буду работать с dto.
The Ant
Ладно, давайте закроем тему. Я понял, через доктрину делать так нельзя, нужно делать по другому. Буду работать с dto.
Вообще можно, если пк не инкремент. Учитывая что эта сущность в твоем случае это копия оригинала, то инкремент тебе и не нужен, т.к. должен сохранять внешний ид. Таким образом тебе ничего не мешает работать с доктриной. Просто стратегию генерации пк убираешь и наслаждаешься жизнью.
Павел
Вообще можно, если пк не инкремент. Учитывая что эта сущность в твоем случае это копия оригинала, то инкремент тебе и не нужен, т.к. должен сохранять внешний ид. Таким образом тебе ничего не мешает работать с доктриной. Просто стратегию генерации пк убираешь и наслаждаешься жизнью.
Там как я понял смысл в другом. Прилетают данные, ТС создает по ним сущность и пихает ее в другую сущность. Другая сущность с ней работает и каким то образом (мб из-за связей) вот это созданная сущность оказывается в em. Но при этом она уже есть в БД, а главное с ней ничего вроде делать и не надо, судя по тому, что в старт топике ТС пишет про Как мне добавить юзера в em, что бы она не считала его новым (ну и update не планировала тоже). Т.е. он ее вообще хочет дропнуть из UoW перед флашем. Т.е. автоинкремент или uuid тут не решает
The Ant
не персистить...
Павел
не персистить...
Ну вот я тоже не совсем понял только что, как она в em оказывается. Возможно там есть сет связи, так как флоу вообще для обычноый работы с доктриной, но тс хчоет приспособить его и к хуку
Павел
Короче там видимо ньансов домена много, поэтому мы не догоняем))
The Ant
Та мутная хрень, согласен. И речь вообще об оптимизации идет, чтобы не делать лишние запросы в бд... Т.е. изначально все работает.
The Ant
странные решения конешь... я бы стартанул с оптимизации настроек бд под задачу )
Михаил
Ну кстати и схожий вопрос. Если я сделал insert через чистый sql, то что бы заполучить сущность в unit of work нужно сделать селект?
Иван
есть у меня подозрение, что тут сурово нарушена единая ответственность
Иван
за хранилище одновременно отвечают куча разных сервисов
Михаил
Обоже, Иван, как вы умудрились залезть в наш корпоративный репозиторий?
Иван
Обоже, Иван, как вы умудрились залезть в наш корпоративный репозиторий?
из одного корпоративного репозитория вынырнул, в другой занырнул!
Г.
Привет, кто-нибудь поможет настроить контейнер symfony, чтобы в приоритете был собственный psr/container?
Г.
дело в том что не удалось настроить symfony/messenger без установки symfony целиком. а старые зависимости написаны через $container->bind('name', \Closure)
Vlad
а что за контейнер?
Г.
иллюминатовский
Vlad
который laravel?
Kirill
погодь, это как не удалось мессенджер настроить?
Kirill
там же нет вообще никаких зависимостей
Kirill
это ж не бандл
Г.
мне надо понять либо как сделать compilerpass умно, или как юзать два контейнера. но симфони на себя в контроллерах автовайринг берет сервисов, а они в ларавельном контейнере
Vlad
погодь, это как не удалось мессенджер настроить?
видимо не хочет руками конфигурить)))
Kirill
за автовайринг в контроллерах в симфе отвечает хттп кернел, а не контейнер
Г.
там же нет вообще никаких зависимостей
я может чего не понимаю, но я пытался сделать чтобы там были и хэндлеры и сендеры и понял сначала что басов должно быть два, потом что надо подключать симфонийскую команду на консюм, протыкивал протыкивал все необходимые аргументы и задолбался
Kirill
а не про инжект в конструктор
Г.
понял, хорошо, у меня некоторые сервисы идут через AwareInterface минуя конструктор, некоторые в конструктор, некоторые в метод контроллера, как удобнее в общем
Kirill
так а что мешает взять и написать свои команды?
Г.
в ларавельном контейнере это всё делалось. сейчас пытаюсь вмержиться в symfony микроприложение, чтобы мессенджер и все консольные команды работали как ожидается.
Kirill
это же просто получение команды и её выполнение
Г.
это же просто получение команды и её выполнение
писать обработку транспортов, смену статусов и удаление из очереди, это реально много писать
Г.
да и не всё там я умею
Г.
с коробки вполне делает как надо, вот только всё остальное не присовывается. была мысль апишкой обернуть и в отдельную папку положить, но решил попробовать свой код в симфони всунуть. если только с контейнерами разобраться
Vlad
а зачем вообще в laravel стек тащить messenger?
Kirill
а зачем вообще в laravel стек тащить messenger?
ну для нормальных очередей это вполне разумно
Г.
а зачем вообще в laravel стек тащить messenger?
там не ларавель стек, там только контейнер и элоквент.