Active Record и Data Mapper
Вопрос
Eloquent реализует Active Record, Doctrine Data Mapper. В чём разница и когда что выбрать?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Active Record: модель знает о базе, сама сохраняется, быстро писать
Data Mapper: сущности не знают о базе, EntityManager и Unit of Work
Минусы Active Record: смешение домена и персистентности, сложнее тестировать без БД
Doctrine: identity map, отложенный flush, сложнее порог входа
Выбор по сложности домена и команде
В Eloquent можно держать логику в сервисах и actions, модели тонкие
Что могут спросить следом
- Что такое Unit of Work?
- Как тестировать бизнес-логику с Eloquent?
Разбор
В Active Record объект строки таблицы и есть модель: $order->save(), связи, скоупы, события, всё в одном классе. Eloquent позволяет очень быстро писать CRUD и типичную бизнес-логику, но модель смешивает предметную область и хранение, а тестировать логику без базы трудно.
В Data Mapper, как в Doctrine, сущности это обычные объекты без знания о базе, а сохранением занимается EntityManager. Он реализует Unit of Work: отслеживает изменения загруженных сущностей и при flush записывает их одной транзакцией, а identity map гарантирует один объект на строку. Такая модель лучше подходит для сложного домена с инвариантами и DDD, но порог входа и объём кода выше.
Я выбираю по сложности: для большинства продуктовых сервисов Eloquent достаточно, если держать модели тонкими, а логику выносить в сервисы или actions и покрывать тестами с базой. Если домен сложный, с агрегатами и долгой жизнью кода, Symfony с Doctrine удобнее.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.