Я работал как с новым Propel, так и с Doctrine2.Что делает DataMapper (и я имею в виду Doctrine2) восхитительным, так это то, что ваши доменные объекты чисты и просты, они не расширяют нерелевантные классы, которые добавляют много нерелевантных методов в ваши классы (как вы сказали, нарушая SRP).Это просто простые сущности с несколькими свойствами и несколькими методами, которые являются частью вашего бизнес-уровня.И это, конечно, позволяет вам писать модульные тесты для них и использовать их в будущем.
Я бы не сказал, что DataMapper значительно сложнее.Это сложно, если вы пишете свою собственную реализацию DataMapper, но Doctrine2 гораздо проще в использовании, чем propel (возможно, за исключением его настройки, мы делаем это только один раз).У него есть менеджер сущностей, который управляет любыми сущностями.У вас могут быть хранилища объектов для сложных запросов.И это все.
А сущность так же проста, как:
/**
* Question
*
* @Entity
*/
class Question
{
/**
* @Column(type="string")
*/
private $title;
public function getTitle() { return $this->title; }
public function setTitle($title) { $this->title = $title; }
}
В Propel у нас будет 6 классов для этой сущности, которые будут содержать много сгенерированного и часто неиспользуемого кода.
Что делает DataMapper более гибким?Простота, которую это обеспечивает.