Вурдалак
Продвинутый новичок
Ну у нас legacy-проект, тогда ещё Doctrine не было, ну тут есть сложности, чтобы вот так взять и использовать Doctrine. Свой старый legacy-велосипед, короче, но DataMapper.oO
А чем тогда пользуешься?
Ну у нас legacy-проект, тогда ещё Doctrine не было, ну тут есть сложности, чтобы вот так взять и использовать Doctrine. Свой старый legacy-велосипед, короче, но DataMapper.oO
А чем тогда пользуешься?
http://thinkbeforecoding.com/post/2009/03/04/How-not-to-inject-services-in-entitiesВ Doctrine сложно инджектить в entity, и авторы не рекомендую это делать, если я правильно помню.
А без этого не значения с конфига не прочитать, да даже банальный translator не вызвать.
Без зависимостей далеко не уедешь, т.е. не сделать хорошую rich entity.
От сюда и проистекает то, что в большинстве случает в Doctrine большинство entity - anemic entity.
Всегда считал такое использование неканоническим и неправильным.Ещё раз привожу ссылку: https://github.com/leopro/trip-planner/blob/master/src/Leopro/TripPlanner/Domain/Entity/Route.php — это anemic или rich? Если anemic, то почему ты так считаешь? Если rich, то почему ты говоришь, что Doctrine не позволяет делать rich? Если я захочу, я сделаю геттер. Не захочу — никто не заставляет, иначе говоря, от меня Doctrine не требует сеттеров и геттеров, она пользуется рефлексией. А что до lazy load, то, по-моему, Doctrine насрать на то сеттер там или что-то другое: просто любое обращение к public-методу будет требовать загрузки.
У меня DTO обескровлены. По руководству.Кстати, я Doctrine не пользуюсь, мне кажется ты лучше знать должен. Ж)
Доктрина - дерьмо, но аналогов нет. Мышки кололись, плакали, но продолжали жрать кактусы.Просто если не Php Doctrine и если не Active Record, то что тогда?
Самые очевидные варианты инъекции будут циклическими зависимостями.О, вот это хороший вопрос. Почему-то все избегают инъекций в entities, какой фреймворк ни возьми - это и "не рекомендуется", и нормального штатного способа это сделать не предоставляется. Почему?
да, именно так и сделано. OrderMapper может быть реализован неявно, но он всегда существует. RDG не является сущностью бизнес-логики. Логика прописывается уровнем выше - DM или AR. Разница только в способе связи - через наследование или через соглашения.чтобы Row Data Gateway остался исключительно на инфраструктурном уровне нужен DataMapper.
Т.е. у вас будет Order в domain layer, а в infrastructure layer будет OrderRDG и DataMapper выполняющий трансформации между Order и OrderRDG.
мне одному кажется, что выбор инструмента конкретной реализации не имеет значения?Doctrine не требует сеттеров и геттеров, она пользуется рефлексией.
А я думал у тебя своя голова на плечах. Например, вот мнение самого автора Doctrine (2012): http://www.whitewashing.de/2012/08/22/building_an_object_model__no_setters_allowed.htmlУ меня DTO обескровлены. По руководству.
То есть тебе нравится anemic? В радикальном случае — просто набор пабликов, да? Нормик?Всегда считал такое использование неканоническим и неправильным.
А что будет с течением времени, когда появятся сотни новых применений этой DTO? Если она будет не обескровленной, то через несколько человеколет ее размер должен сильно вырасти.А я думал у тебя своя голова на плечах. Например, вот мнение самого автора Doctrine (2012): http://www.whitewashing.de/2012/08/22/building_an_object_model__no_setters_allowed.html
Я не могу оспорить это утверждение, кроме как поправить, что не «по руководству», а «по определению». Речь не о том что такое DTO, это знают дети в детском саду, а каким должна быть модель-сущность: DTO (=== anemic) или аналогом того, что выше с Route.У меня DTO обескровлены. По руководству.
Декомпозиция (выделение новых сущностей, value object'ов; вынесение каких-то вещей в свои спецификации, если требуется), рефакторинг модели в соответствии с изменениями в бизнес-логики/требованиях.А что будет с течением времени, когда появятся сотни новых применений этой DTO? Если она будет не обескровленной, то через несколько человеколет ее размер должен сильно вырасти.
Когда у DTO появляется связь с десятком других DTO за человекогод (или месяца два реального времени), единственным способом не превращать ее в GodObject - это не давать ей логику вовнутрь, а использовать сервисы.
С того, что я такую проблему обозначил, мы тему и начали.я просто вижу реальные проблемы в таких тупых идиотских подходах типа полностью пустых моделей без логики
Есть ещё такая штука, как http://martinfowler.com/bliki/BoundedContext.html Если у тебя в рамках приложения с одной сущностью есть миллион применений, то такая модель в любом случае перегружена. Поэтому крупный сайт почти всегда можно поделить на кучу более мелких domain'ов: биллинг, игры, чат, etc. Та же самая декомпозиция.А что будет с течением времени, когда появятся сотни новых применений этой DTO?
Но есть же какая-нибудь центральная сущность (или несколько), вокруг которых существуют все остальные. Например, пользователь, у которого есть куча всего, и постоянно появляется что-то новое, что к нему относится.Есть ещё такая штука, как http://martinfowler.com/bliki/BoundedContext.html Если у тебя в рамках приложения с одной сущностью есть миллион применений, то такая модель в любом случае перегружена. Поэтому крупный сайт почти всегда можно поделить на кучу более мелких domain'ов: биллинг, игры, чат, etc. Та же самая декомпозиция.
Ну так я понимаю у тебя будет две сущности User, которые могут отличаться. Например, в контексте биллинга мне не будет интересна (наверное) раса пользователя. Если только это не WhitePowerBillingDomain.Но есть же какая-нибудь центральная сущность (или несколько), вокруг которых существуют все остальные. Например, пользователь, у которого есть куча всего, и постоянно появляется что-то новое, что к нему относится.
Про паттерн почитаю, спасибо.
А если всегда нужны несколько (минимум 5) основных полей?Ну так я понимаю у тебя будет две сущности User, которые могут отличаться. Например, в контексте биллинга мне не будет интересна (наверное) раса пользователя. Если только это не WhitePowerBillingDomain.
Я не знаю, it depends. Если эти понятия можно объединить в одно (например, UserCredentials, UserProfile, etc.), то можно вынести в отдельный value object. Наследование — это обычно всегда крайний вариантА если всегда нужны несколько (минимум 5) основных полей?
В итоге нашел довольно удобный способ для доктрины:Я не знаю, it depends. Если эти понятия можно объединить в одно (например, UserCredentials, UserProfile, etc.), то можно вынести в отдельный value object. Наследование — это обычно всегда крайний вариант![]()