
Sergey
18.02.2017
15:00:59
array_map($query->getArrayResult(), function($row) { return new SomeComplexObject(new SomeOtherObject(u.id, u.profile.name));});
аргументы только наоборот)

Sergey
18.02.2017
15:01:46
да, можно так конечно
но тогда ты теряешь эмбеддед объекты (VO)

Google

Sergey
18.02.2017
15:03:12
ну то есть.... либо ты остаешься совсем без мэппингов и делаешь свой

Sergey
18.02.2017
15:03:13
ну и хуй с ними

Sergey
18.02.2017
15:03:26
хочу все в dql описать)

Алексей
18.02.2017
15:09:21
А вот второй вариант со вложенными DTO - интересно выглядит.
Можно, конечно, на уровне конструктора разруливать, в принципе.

Sergey
18.02.2017
16:06:10

Vadim
20.02.2017
04:34:08
Всем привет!
Начинаю тут понемногу переписывать старый прототип на что-то нормальное, выбрал, соответственно, симфони. И столкнулся с такой проблемой - в приложении 6 бд, 2 из них "свои" (нужно мигрировать и все такое) и 4 "чужие" (приложение туда ходит напрямую просто как клиент).
И вот не могу пока найти способ, как удобно разрулить несколько ентити менеджеров, чтобы не плодить бандлы.
Во, сам спросил, сам ответил) http://stackoverflow.com/a/15027134

Evg
20.02.2017
05:52:34
а главное что поделился этим ответом с другими?

Vadim
20.02.2017
06:02:33

Aleh
20.02.2017
06:06:05

Google

Vadim
20.02.2017
06:07:22
может тут вообще есть 3й способ, как это лучше сделать :)

Aleh
20.02.2017
06:25:28
А у тебя там точно сущности?
Ну точнее, точно ли там сущности, которыми должна оперировать(и менять!) твоя приложенька?

Vadim
20.02.2017
06:27:21
да
насчет остальных 4х не уверен, но вот в 2х бд да
там грубо говоря одна про тесткейсы, другая про билды мобильных приложений

Aleh
20.02.2017
06:28:51
Мммм

Vadim
20.02.2017
06:35:00
может та часть, которая про мобильные приложения вообще тянет на отдельный банлд, т.к. пересечений с основным приложением все же нет, только я не особо представляю, как сюда каноничней авторизацию сунуть, она ж нужна на всех одна, нормально ли с AppBundle делать авторизацию, а чтоб другой банлд зависел от этого

Aleh
20.02.2017
06:59:21
@fes0r расскажи человеку как ты делаешь "микросервисы" на симфони, оставляя монолит

Sergey
20.02.2017
07:37:35
Ась? ну есть такое
делаю)
я лично юзаю (апишки)
в json-ке токена вся необходимая информация для авторизации. И есть отдельный "модуль" который эти токены генерит
остальные токены берут из токена все что им надо (например нужно запомнить юзера - айдишку оттуда достают)

Vadim
20.02.2017
07:40:17
хм, у меня апи будет лишь крайне малая часть приложеньки, все остальное вполне себе такая большая вебня

Sergey
20.02.2017
07:41:04
тут мысль в другом

Google

Sergey
20.02.2017
07:41:33
у меня просто проект разбит на N независимых модулей
и я сейчас жестко убираю между ними пересечения границ модулей (когда например модуль A хочет сущности из модуля Б просто так)
если через пол годика проект еще будет живой - будем уже на микросервисы муваться (ибо там уже нужно будет из соображений масштабирования, если все ок будет с нагрузкой)

Vadim
20.02.2017
07:47:11
вот благо проблем с нагрузкой не предвидится ибо сугубо внутренний сервис, нужно просто красиво разделить все это, сейчас думаю просто в AppBundle\Controllers раскидать по неймспейсам, соответственно и в Entity так же раскидать, тогда вроде особо проблем и нет, можно особо не заморачиваться сильно, даже все работает, но хочется сразу сильно не наговнякать и не переусложнить одновременно.
к симфони до этого было несколько подходов, но все они провалились по причине игрушечных задач, а тут вполне себе такая большая опердень

Sergey
20.02.2017
07:49:31
https://gist.github.com/fesor/76d39b19b18f7103a7c058301dc6a8fe
вот недавно накидал
по поводу структуры проекта

Aleh
20.02.2017
07:51:34

Sergey
20.02.2017
08:01:45
я еще по поводу изоляции модулей особо не писал там, это пока тип драфт
но в целом мысль - чем меньше пересечений границ - тем проще

Aleh
20.02.2017
08:12:48
годно короч

Alan
20.02.2017
08:14:19
а если будет комментарий у продукта куда класть? вложенность плохо, на одном уровне с продуктом и заказом - не понятно чей комент

Sergey
20.02.2017
08:14:40
вложенность не плохо, просто пока можно надо ее избегать
ну и просто появитя модуль Comments
ну то есть внутри Products
или просто сущность
зависит от требований)
репозиторий им не нужон, VO не нужны особо

Aleh
20.02.2017
08:15:50
домен короч не отделяешь от фреймворка?)

Sergey
20.02.2017
08:16:04

Google

Sergey
20.02.2017
08:16:10
там не говорится "никогда не делайте вложенность"

Sergey
20.02.2017
08:16:39

Sergey
20.02.2017
08:16:42
там говорится "делайте вложенность только когда видите что это надо"

Aleh
20.02.2017
08:16:46
я думал Action/Doctrine специфичное для фрейма

Alan
20.02.2017
08:16:50
а если Система оплаты, в ней разные способы оплаты и есть транзакция (платеж) ?

Sergey
20.02.2017
08:17:27
ну мол у тебя будут интерфейсы а в инфраструктуре для каждого гейтвея хоть делай адаптеры

Admin
ERROR: S client not available

Aleh
20.02.2017
08:18:25

Alan
20.02.2017
08:26:09
ну в целом что то такое у sylius в виде компонент
https://github.com/Sylius/Sylius/tree/master/src/Sylius/Component

Aleh
20.02.2017
08:27:18
там есть Core, подозреваю, что все остальные прям к нему прибиты)

Sergey
20.02.2017
08:28:21
да, Core не ок
да, Core говно
назвали бы Infrastructure... вопросов бы небыло

Daniel
20.02.2017
10:15:37
Я обязательно прочитаю про жизненный цикл доктрины еще 10 раз, но проблема есть сейчас...
Вот есть Lifecycle doctrine, тама есть:
1)prePersist
2)preUpdate\preRemove
3)postFlush
4)onClear
Мне нужно отловить событие именно на СОЗДАНИЕ нового объекта, которого еще нет в базе данных.
Предположительно нужно ловить preUpdate и смотреть, если объект еще не содержит ID, то он только создается.
Сейчас задача стоит, что есть в сущность implement IntegrationOneCInterface, то при создании нового объекта нужно чтобы листенер загружал из него данные в 1С.

Google

Daniel
20.02.2017
10:17:08
И тоже самое с обновлением, чтобы 100% полная синхронизация была.
Запара на моменте с определением: доктрина будет делать INSERT или UPDATE.

Kirill
20.02.2017
10:21:31
prePersist/postPersist

Daniel
20.02.2017
10:34:01
А если допустим косяк и flush не будет выполнен после persist, либо будет ROLLBACK из-за ошибки и транзакция откатится в базе данных, а в 1С базу все добавится?
Как бы preUpdate норм, но он не работает соответственно на этапе создания, а не обновления

Timur
20.02.2017
10:36:08

Daniel
20.02.2017
10:36:46
what
public function preFlush(PreFlushEventArgs $args)
{
$args->getEntityManager()->getUnitOfWork()->getScheduledEntityInsertions()
}
Надеюсь не говно делаю
Но собака работает
Можно данным на обновление дать команду в очередь на обновление соответственно
На удаление - в очередь на удаление
На создание - в очередь на создание
И все вешать на postFlush вообще
ОнФлуш


Sergey
20.02.2017
14:45:48
https://gist.github.com/fesor/76d39b19b18f7103a7c058301dc6a8fe
дочитал
ну в общем все по делу, вот только со вложенностью я все же опять не согласен)
вот к примеру есть модуль. у него есть сервис, который работает по интерфейсу с разными стратегиями. учитывая что эти стратегии никто кроме него не может юзать, то они логично идут в неймспейс с именем этого сервиса. все эти стратегии тоже не высосаны из пальца и имеют свои зависимости от компонентов. и опять эти компоненты нужны только им, они идут еще на один уровень глубже. в итоге имеем где-то 3-4 уровня вложенности.
а вот как раз если компоненты из этих уровней нужны где-то еще, тогда их логично перемещать на уровень где они нужны или делать вообще отдельный модуль и flat

Sergey
20.02.2017
16:09:10
нипонял
ну то есть... надо делаешь так как ты описал, не надо - не делаешь
если у тебя 3 стратегии - зачем их выносить
а если добавятся еще 5 - ну refactor -> move

Sergey
20.02.2017
16:11:10
я к тому что если стараться всегда делать flat то будет каша из модулей

Sergey
20.02.2017
16:11:24
в частности L и I
это точно так же как coupling и coheasion