【问题标题】:Using repository pattern with ORM将存储库模式与 ORM 结合使用
【发布时间】:2014-03-17 22:48:16
【问题描述】:

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

类似这样的: UserController 接收帖子数据并将其传递给UserServiceUserService 创建一个用户对象并使用$user.save(); 将其保存到数据库中

现在我正在为两件事苦苦挣扎:

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

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

【问题讨论】:

    标签: orm repository-pattern


    【解决方案1】:

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

    关于模型和您的 ORM - ORM 可能存在于模型中。所以你应该要求你的模型创建一个新对象(它可能代表一个表或一系列相关的表——你的模型应该理解这些关系)。然后,您可以将数据传递给您的模型,然后您的模型应该将数据存储到相应表中的相应列中。一个简单的例子,想象创建一个名为“Family”的对象,您可以在其中指定 2 个父名称、可变数量的子名称,然后告诉模型保存它。模型可以使用这个“家庭”对象并创建一个家庭表记录和 5 个人员表记录,将一些标记为父母,另一些标记为孩子。

    第二:提到的“存储方法”(在我看来)是指您使用的数据库。例如,我知道 Propel 支持 MySQL、PostgreSql、MSQL、Oracle 等。我将配置切换到不同的数据库 Propel 将自动开始为新数据库使用适当的语言。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多