什么,*具体*,使DataMapper比ActiveRecord更灵活?

Bil*_*eal 6 php database orm datamapper

我正在比较Doctrine 2和Propel 1.5/1.6,我正在研究他们使用的一些模式.Doctrine使用DataMapper模式,而Propel使用ActiveRecord模式.虽然我可以看到的DataMapper是相当复杂的,我会承担一些设计灵活性来源于此并发症.到目前为止,我发现使用DataMapper而不是ActiveRecord的唯一正当理由是DataMapper在单一责任原则方面更好 - 因为数据库行不是持久化的实际对象,但是Propel并不是真的关心我,因为无论如何它都是生成的代码.

那么 - 是什么让DataMapper更加灵活?

mez*_*eze 4

我曾经使用过新的 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; }

}
Run Code Online (Sandbox Code Playgroud)

在 Propel 中,我们将为该实体提供 6 个类,其中包含大量生成且经常未使用的代码。

是什么让 DataMapper 更加灵活?它提供的简单性。

  • @meze:如果我想编写类似 SQL 的东西,那么为什么要首先使用任何描述的 ORM 呢?也就是说,如果我仍在编写本质上是 SQL 的东西,为什么不只编写 SQL 查询呢?对 Base* 类的事情不太积极。我会玩并让你知道。(抱歉,如果我在这里听起来很争论——我是在唱反调,因为我还没有看到一个*特定的*案例使得 DataMapper 比 ActiveRecord 更好) (3认同)