将存储库模式与ORM一起使用

时间:2014-02-18 09:32:50

标签: orm repository-pattern

我创建了一个小项目,我将数据从控制器传递到服务类,该服务类使用ORM来保存对象:

这样的事情: UserController收到帖子数据并将其传递给UserServiceUserService创建用户对象并使用$user.save();

将其保存到数据库

现在我正在努力解决两件事:

首先: 假设我使用存储库来添加用户,它将是这样的: Controller将后期数据传递给创建用户对象的服务,并将其传递给存储库。存储库唯一要做的就是调用$user.save(),这有点奇怪吗?为什么不在我的服务中调用save,因为使用存储库来调用save方法对我来说似乎有点过分了。

第二 我读到,当您使用存储库时,您可以轻松更改存储方法,因为您的应用程序不知道使用了哪个存储方法。但在将对象传递到存储库之前,您必须创建它。 使用ORM,每个都有不同的方式:Doctrine使用$user = new User而Propel使用$user = new User(),idiorm使用$user = ORM::for_table('user')->create();所以当由于某种原因切换到另一个ORM时,需要在项目中更改它也没有?

1 个答案:

答案 0 :(得分:0)

首先:阅读一下模型视图和控制器的职责。在此网站上有一个例子的合理解释:http://tomdalling.com/blog/software-design/model-view-controller-explained/

关于模型和您的ORM - ORM可能存在于模型中。因此,您应该要求您的模型创建一个新对象(可能代表一个表或一系列相关表 - 您的模型应该理解这些关系)。然后,您可以将数据传递给模型,然后您的模型应将数据存储到相应表中的相应列中。一个简单的例子,想象一下创建一个名为' Family'您可以在其中指定2个父名称,可变数量的子名称,然后告诉模型保存它。该模型可能会采用这个家庭'对象并创建一个Family表记录和5个Person表记录,将一些标记为父项,将其他标记为子项。

第二:“存储方法”' (我认为)指的是您使用的数据库。例如,我知道Propel支持MySQL,PostgreSql,MSQL,Oracle等。我将配置切换到不同的数据库Propel将自动开始说出新数据库的相应语言。