Bil*_*eal 6 php database orm datamapper
我正在比较Doctrine 2和Propel 1.5/1.6,我正在研究他们使用的一些模式.Doctrine使用DataMapper模式,而Propel使用ActiveRecord模式.虽然我可以看到的DataMapper是相当复杂的,我会承担一些设计灵活性来源于此并发症.到目前为止,我发现使用DataMapper而不是ActiveRecord的唯一正当理由是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; }
}
Run Code Online (Sandbox Code Playgroud)
在 Propel 中,我们将为该实体提供 6 个类,其中包含大量生成且经常未使用的代码。
是什么让 DataMapper 更加灵活?它提供的简单性。