Php 存储库模式与ORM
当您有ORM时,存储库模式有什么好处 例如。假设我有以下(虚构的)表格: 表格:用户Php 存储库模式与ORM,php,orm,repository-pattern,Php,Orm,Repository Pattern,当您有ORM时,存储库模式有什么好处 例如。假设我有以下(虚构的)表格: 表格:用户 pk_user_id fk_userrole_id username fk_userrole_id role 表格:用户角色 pk_user_id fk_userrole_id username fk_userrole_id role 现在使用orm,我可以简单地将其放入模型文件中: $user = ORM::load('users', $id); 现在$user已经是我的对象,可以很容易地延迟加载:
pk_user_id
fk_userrole_id
username
fk_userrole_id
role
表格:用户角色
pk_user_id
fk_userrole_id
username
fk_userrole_id
role
现在使用orm,我可以简单地将其放入模型文件中:
$user = ORM::load('users', $id);
现在$user已经是我的对象,可以很容易地延迟加载:
(如果事情自动单数化/复数化,那就更好了)
现在使用Repository模式,我必须为用户和角色创建一个存储库。存储库还需要各种函数来为我检索和存储数据。此外,它还需要使用实体模型。所以我也必须创造所有这些 对我来说,这看起来像是很多事情要做。。。当我可以简单地用ORM获取上面描述的数据时。我可以很容易地存储它: ORM::存储($user) 在这种情况下,它不仅将用户对象存储到数据库中,还将存储我对“角色”对象所做的任何更改。因此,不需要像存储库模式那样进行任何额外的工作
所以我的问题基本上是,为什么我要将存储库模式与ORM一起使用?我已经看到了在哪里使用该模式的教程(如Doctrine)。但这对我来说真的没有任何意义。。。任何人都可以解释它与ORM结合使用的原因。ORM是存储库的一个实现细节。ORM只是使以OOP友好的方式访问db表变得容易。就这样 存储库抽象持久性访问,无论它是什么存储。这就是它的目的。使用db或xml文件或ORM并不重要。存储库允许应用程序的其余部分忽略持久性细节。通过这种方式,您可以通过模拟或存根轻松测试应用程序,如果需要,您可以更改存储。今天您可能会使用MySql,明天您可能会希望使用NoSql或云存储。用ORM做那件事 存储库处理域/业务对象(从应用程序的角度来看),ORM处理db对象。业务对象不是db对象,第一个是行为,第二个是美化的DTO,它只保存数据 编辑 您可能会说,存储库和ORM都是对数据的抽象访问,然而,问题在于细节。存储库抽象出对所有存储关注点的访问,而ORM抽象出对特定RDBMS的访问 简而言之,存储库和ORM有不同的用途,正如我前面所说的,ORM始终是回购协议的一个实现细节
您还可以查看有关存储库模式的更多详细信息。ORM和存储库模式…取决于设置。
另外,当有人谈论工作单元时,我会很小心,尤其是在使用ORM时。几乎互联网上的每一个样本在架构方面都是失败的。如果您需要UoW,为什么不使用TransactionScope(只需确保您有一个包装器,默认情况下使用的不是可序列化事务)。在99.9%的情况下,您将不需要管理2组独立的数据更改(因此2组OuW),因此TransactionScope将是.NET中的一个好工具-对于PHP,我将寻找一些开放会话视图实现…ORM是一种反模式。我不能说我真的同意那个帖子。尤其是在现代社会。它为你懒散地加载关系,你可以很容易地指定你想要什么颜色(如果你需要)。@w00在你看来,你并不孤单。。。有关存储库作为反模式的一些讨论,请参见此处: