我创建了一个小项目,我将数据从控制器传递到服务类,该服务类使用ORM来保存对象:
这样的事情:
UserController
收到帖子数据并将其传递给UserService
。
UserService
创建用户对象并使用$user.save();
现在我正在努力解决两件事:
首先:
假设我使用存储库来添加用户,它将是这样的:
Controller将后期数据传递给创建用户对象的服务,并将其传递给存储库。存储库唯一要做的就是调用$user.save()
,这有点奇怪吗?为什么不在我的服务中调用save,因为使用存储库来调用save方法对我来说似乎有点过分了。
第二
我读到,当您使用存储库时,您可以轻松更改存储方法,因为您的应用程序不知道使用了哪个存储方法。但在将对象传递到存储库之前,您必须创建它。
使用ORM,每个都有不同的方式:Doctrine使用$user = new User
而Propel使用$user = new User()
,idiorm使用$user = ORM::for_table('user')->create();
所以当由于某种原因切换到另一个ORM时,需要在项目中更改它也没有?
答案 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将自动开始说出新数据库的相应语言。