Ответ 1
Здесь лучшее резюме о ролях и терминологии Учения 2.
Entity используется шаблоном UnitOfWork в Doctrine 2.0 ORM (и в Hibernate в мире Java), а также является объектным представлением объекта в реальном мире. Он имеет те же атрибуты и методы, что и запись, но не знает о ее сохранности. Это в основном POPO (обычный старый объект PHP). Это позволяет этим классам и объектам быть очень легкими.
Модель - это концептуальное объектное представление вещи. Этот термин может быть использован для всего вышеперечисленного. Запись - это модель, такая же, как сущность или документ. Термин описывает объектное представление вещи.
Поэтому, если вы хотите создать пакет с некоторыми моделями в нем и хотите, чтобы ваш пакет не зависел от какого-либо уровня персистентности, вы должны создать классы моделей и интерфейсы, которые определяют эту вещь.
Вы бы определили и/или реализовали там все, что не является специфичным для какой-либо персистентной реализации, и вы бы использовали связанный объект или класс документа через делегирование для обработки конкретного материала.
Это делается, например, в FOSUserBundle, который определяет модель пользователя. Эта модель User используется во всем пакете, но не имеет полной реализации для доступа к своим собственным данным (я не смотрел, но думаю, что это мог быть только интерфейс). Окончательная реализация выполняется в классе сущностей, а другая - в классе документов, поэтому независимо от того, используете ли вы MySQL или MongoDB, вы все равно можете работать с той же моделью User. Вы даже можете переключаться с одного на другой, не изменяя свой код, поскольку он всегда использует модель, которая не зависит от сущности или документа.