
Dmitry
23.07.2017
09:55:06
но в общем не суть... ;)

Sergey
23.07.2017
09:55:19
наркоманы...
секу
как насчет переопределить RepositoryManager

Google

Sergey
23.07.2017
09:56:24
что бы тот по тегу доставал нужный сервис из контейнера?
и решить проблему на корню

Dmitry
23.07.2017
09:56:58
вот это и была идея первая, да... удивился, что это решение не лежит где-то явно ;)
но потом забил и сделал через агрегацию, как и говорили в начале

Sergey
23.07.2017
09:57:18
ну это не проблема доктрины - это проблема этого fos elasticsearch bundle

Dmitry
23.07.2017
09:59:39
ну не скажи... если у меня только доктриновскиая репа, и ее нужно инжектитть куда-то, приходися описывать получение ее через фабричный метод (ни или вобще забыть про доктриновский менеджер)... мне бы вариант больше понравился, когдя я явно описал репозиторий как сервис и дальше инжекчу его куда хочу плюс докриновский менеджер его ловит тоже хотя бы для впросов обратной совместимости или бандлов, которые используют менеджер

Sergey
23.07.2017
10:17:57
я не инджекчу репы доктрины никуда
ну и опять же - всегда можно написать compile pass, тут проблема просто в том что у тебя тип будет одинаковый и как потом разруливать какой именно инстанс ты хочешь заинджектить - это придется тоже руками прописывать

Ivan
23.07.2017
10:22:34

Sergey
23.07.2017
10:22:52
что значит "оставляешь"?
я ее не юзаю

Ivan
23.07.2017
10:23:03
не юзаешь, вот
то есть доктрина не узнает, как достать репозиторий для сущности

Google

Sergey
23.07.2017
10:25:01
ей и не нужно

Ivan
23.07.2017
10:25:31
сторонние бандлы могут требовать $em->getRepository(class),

Dmitry
23.07.2017
10:25:32
Ну он, видимо, пишет так, что бы никто никогда и не спрашивал доктрину "дай репу"... и в принципе я тоже думал пойти этим путем

Ivan
23.07.2017
10:26:01
чем плохо, если сохранять такую совместимость?

Sergey
23.07.2017
10:26:03

Ivan
23.07.2017
10:32:45
а вто такой вопрос, юзаем мы реализацию репозитория InMemory и доктриновский, делаем их напоминающих коллекцию, и вроде как ожидаем, что после того как положишь в репо, в ней можно найти эту сущность (можно назвать это контрактом?). Так вот с InMemory всё хорошо, а вот с Doctrine обязательно нужно флашить.
нужно ли флашить сразу? или как-то запоминать сущности, которые ещё sheduledForInsertion, чтобы отдать их например в методе get($id)
`
$book = new Book($isbn);
$books->add($book);
$books->get($isbn); // здесь должна быть сущность?
BookRepository::add(Book $book) { $this->em->persist($book); }


Sergey
23.07.2017
10:53:54
> (можно назвать это контрактом?)
да, вполне
контракт регламентирует как твой объект будет себя вести в той или иной ситуации
> Так вот с InMemory всё хорошо, а вот с Doctrine обязательно нужно флашить.
не обязательно, если ID уже есть и сущность была положена в unit of work
ну тут такой нюанс - если ты юзаешь findBy какой-нибудь - то да, это не прокатит.
а если по ID - то влегкую все будет работать
если смотреть по твоему примеру - то все будет работать корректно
если конечно ты не пользуешься богомерзскими автоинкрементами. Тогда ты просто напоролся на ограничение твоего слоя хранения данных и инфраструктуры. Увы и ах не все может быть идеальным.
либо тогда юзай uuid либо меняй базу на ту что умеет секвенсы
но вообще у меня к тебе другой вопрос - зачем тебе in memory репозитории?)
и определись какая из твоих реализаций нарушает контракт)

Google

Sergey
23.07.2017
10:58:39
что было первым и кто является эталоном

Ivan
23.07.2017
10:59:32

Sergey
23.07.2017
10:59:54
ну то есть их обычно в контексте тестов применяют - и тут проще взять какой-нибудь профет и сделать стаб

Ivan
23.07.2017
10:59:56
просто считаю, что должно быть так, как в InMemory

Sergey
23.07.2017
11:00:22
это в идеале должно быть, в этом смысл persistance ignorance, что бы оно работало все как in memory repository

Dmitry
23.07.2017
11:01:05
ну делай flush каждый раз и будет так

Sergey
23.07.2017
11:01:10
это идеальная модель так скажем выполнения, которая увы не может быть реализована на 100% в реальности без огромных ограничений. Unif-of-work + identyty map как раз те штуки которые для твоего простого примера позволяют добиться одинакового поведения репозитория для работы с базой, и ин мемори

Dmitry
23.07.2017
11:02:03
с идеологической тоже flush ;)

Sergey
23.07.2017
11:02:45
оно все всеравно к этому сведется
но идея в том что бы понимать какие ограничения инфраструктуры и какие идеи лежат за необходимостью делать flush

Dmitry
23.07.2017
11:03:28
почему? это ответ. внутреннее состояние нужно синхронизировать со внешним... это, скорее, inmemory - исключение

Sergey
23.07.2017
11:03:42
илаче у тебя не соблюдены контракты, нарушен LSP

Dmitry
23.07.2017
11:04:21
чепуха, на уровне репозитория - исключения могут и должны быть, на то он и репозиотрий

Sergey
23.07.2017
11:04:26
и теряется всякий смысл в in memory repository. а если в нем нет смысла - можно уже задаваться вопросом зачем тебе вообще понадобилось что-то такое сложное как доктрина
короче, что бы проще - это вопрос о дихотомии persistance ignorance и ограничений инфраструктуры

Ivan
23.07.2017
11:05:59

Google

Dmitry
23.07.2017
11:06:01
нет никакой ложки, flush скрыт в репозитории

Sergey
23.07.2017
11:06:12

Ivan
23.07.2017
11:06:35

Dmitry
23.07.2017
11:06:35
с чего бы?

Sergey
23.07.2017
11:06:44
с чего бы?
для начала уточню - ты делаешь flush прямо в репозитории?

Ivan
23.07.2017
11:07:04

Dmitry
23.07.2017
11:07:22

Sergey
23.07.2017
11:07:48

Ivan
23.07.2017
11:07:54

Admin
ERROR: S client not available

Sergey
23.07.2017
11:08:02
flush, как ты верно сказал, это "синхронизация состояния"
вот только выполняться эта синхранизация должна в конце бизнес транзакции
репозиторий не может и не должен знать где пролегает граница бизнес транзакции

Ivan
23.07.2017
11:09:20
хотя я не делаю флаши в репозитории

Sergey
23.07.2017
11:09:54
вот не очень понятно, почему?
репозиторий = полки. Она хранит книги. Полка не очень то и знает что происходит с книгами, кто их берет, зачем, что с ними делает и т.д
ее работа - хранить книги
и что бы меньше смущаться, поскольку мы говорим не о реальных объектах, когда ты книгу берешь и просишь книгу поменять стэйт например, репозиторий тебе только ссылку на книгу дал и ты уже по ней работаешь

Google

Sergey
23.07.2017
11:11:36
то есть книга будучи положенной в репозиторий физически остается там
а ты работаешь из другого места со стэйтом книги, о чем репозиторий физически знать не может
или еще пример
ты положил книгу на полку, и есть у тебя еще учетные записи читателей

Dmitry
23.07.2017
11:12:53
т.е. ты хочешь сказать, что в случае эталонной inmemory репы вопросов бизнес-транзакций не возникает? ;)

Sergey
23.07.2017
11:13:13
более реальный пример ибо мне лень выдумывать

Dmitry
23.07.2017
11:14:03
раз такая же схема, как ты закончишь бизнес транзакцию в случае inmemory репозитория?

Sergey
23.07.2017
11:14:35
1. достаем заказ из репозитория по айдишке
2. просим его поменять статус
3. при изменении статуса заказ внутри себя запоминает когда и с какого статуса на какой были изменения. Типа лога. Записывает это в коллекцию свою минуя репозитории ибо в этом случае заказ это и есть корень агрегата а коллекция связей выступает как im-memory репозиторий.
идеальный вариант делать flush - контроллер

Dmitry
23.07.2017
11:15:26
т.е. для inmemory репозитория тоже нужен flush?

Sergey
23.07.2017
11:15:41
flush нужен для того что бы ты работал с данными в базе так, как если бы они были в inmemory репозитории. Эдакий кастыль для того что бы более четко разделить ответственность
(если что под контроллером я тут подразумеваю сферический GRASP контроллер)
это может быть симфоневый контроллер, сервис уровня приложения который регламентирует последовательность операций бизнес транзакции, команда консольная...

Dmitry
23.07.2017
11:17:25
не понимаю ;) если flush по твоему - завершение бизнес транзакции, а для inmemory - ее нет, то у нас inmemory может находится в неконсистентном состоянии

Sergey
23.07.2017
11:18:03
и как консистентный объект который лежет в памяти может потерять консистентность?
p.s. представь себе однопоточное PHP приложение которое хранит вообще все данные в памяти и никогда не падает и вот для этой ситуации

Dmitry
23.07.2017
11:18:51
объектов может быть много
со связанными состояниями

Sergey
23.07.2017
11:19:24
и? это не задача репозитория - это задача твоих сущностей как не выходить из консистентного состояния