我正在比较 Doctrine 2 and Propel 1.5/1.6 ,我正在研究他们使用的一些模式。 Doctrine 使用 DataMapper 模式,而 Propel 使用 ActiveRecord 模式。虽然我可以看到 DataMapper 相当更复杂,但我认为这种复杂性会带来一些设计灵 active 。到目前为止,我发现在 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/