我正在比较Doctrine 2 and Propel 1.5/1.6,并且正在研究他们使用的一些模式。 Doctrine使用DataMapper模式,而Propel使用ActiveRecord模式。虽然我可以看到DataMapper相当复杂,但我认为这种复杂性会带来一些设计灵活性。到目前为止,我发现在ActiveRecord上使用DataMapper的唯一合法理由是,就单一职责原则而言,DataMapper更好-因为数据库行不是要持久存储的实际对象,但是使用Propel并不是真正的持久对象让我担心,因为它还是会生成代码。
那么-是什么使DataMapper更加灵活?
最佳答案
我曾经使用过新的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更加灵活?它提供的简单性。
关于php - 什么(特别是*)使DataMapper比ActiveRecord更灵活?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5032892/