Koenig, спасиб) буду перечитывать пока не въеду если что кидай в лику полезное по веб ЯП
# Delphinum (29.11.2016 / 22:21)
L!MP, там сложная логика, реализуется через стороннее решение. По сути да, это прокси содержащий саму
Ну да. Я тебе говорил про прокси в этом же трэде раннее и давал ссылку на эту же библиотеку.
Мы тогда говорили о твоём Mapper и Entity которые имеют рекурсивную зависимость. Её то как раз и можно было решить используя прокси.
L!MP, можно было бы через прокси, но мне было лень ) реализовал проще
имеет смысл прикрутить родительские контейнеры (правда это повлияет на поток исполнения и замедлит работу контейнера в целом) и инициализаторы.
Хотя не, инициализаторы это получается setter injection на основе интерфейса или родительского класса. Ну его.
Тем более они там сами пишут что штукой лучше не пользоваться, гг.
but we highly discourage their usage.
L!MP, да, у инициализаторов есть свои минусы.
Delphinum, ну, про контейнеры по говорили. Теперь вот ещё какая интересная штука.
Ты же наверняка знаешь о
IdentityMap, так вот, контексте использования этого паттерна в
ORM.
Допустим есть у нас такой псевдокод:
$entityOne = $orm->getByOid(5);
$entityTwo = $orm->getByOid(5);
var_dump($entityOne === $entityTwo); //=> true, потому что у нас там под капотом есть IdentityMap который сравнил oid и второй раз не стал делать запрос к БД, а вернул уже имеющуюся сущность
И тут всё просто и понятно, но как быть с более сложными запросами.
На пример мы извлекаем сущности по условию соответствия какому то сложному условию.
$entityOne = $orm->newQuery()->where('login', '=', 'L!MP')->getFirst();
$entityTwo = $orm->newQuery()->where('login', '=', 'L!MP')->getFirst();
var_dump($entityOne === $entityTwo); //=> как тут быть, ведь есть ещё более сложные случаи, на пример, получили одну сущность, а затем коллекцию сущностеё по какому-то условию и в коллекцию попадает эта же сущность, нужно ли делать так чтоб они были идентичными?
Должен ли ORM и в этом случае следить за сущностями по карте соответствия или нет.
В доктрину я не лез, меня малость подташнивает когда я начинаю пробовать разобраться в её работе.
Так что я про смотрел несколько библиотек, пока только на РНР и вижу что карта соответствия у них работает только на запросы по Oid (типа ->getByOid(1) и ->getByOids(1, 2, 3)).
L!MP, по хорошему она должна работать всегда, но лично я вообще не вижу в ней смысла, так как ни разу еще не сталкивался с проблемами, вызванными сравнением объектов, ведь можно просто сравнить их по id и будет счастье
И да, смысл IdentityMap не в том, что оно не выполняет доп запросы к базе (для этого есть кеш). Этот паттерн позволяет избежать проблем с дублированием: "Если разработчик не достаточно аккуратен, может получиться, что он загрузит данные из БД в два объекта. Потом, когда он сохранит их, получится путаница и конкуренция различных данных."
# Delphinum (02.12.2016 / 23:04)
И да, смысл IdentityMap не в том
Я понимаю зачем он нужен, я просто описывал последовательность действий, что сущность второй раз из БД не запрашивается, а возвращается та, что уже создана.
Ну если его включать для всего, то это х.з какой оверхэд будет.
Каждый обьект с метаданными для поиска нужно сохранить, потом перед каждым запросом искать сначала по карте.
Х.з, да же как такое реализовать.