php - MVC 和存储库模式 : Roles of Controllers, 模型和存储库?

标签 php model-view-controller design-patterns repository-pattern

因此,我一直在研究存储库模式的作用,作为一种将持久层与 MVC 框架中的模型分离的方法。在此之前,我可能会让我的 UserModel 直接调用事件记录方法以存储/检索域对象。

下面是我对创建新 User 的请求中的调用堆栈的想法的草图:

enter image description here

这是我的问题:

  1. 这是存储库模式的正确实现吗?
  2. 我知道 Controller 应该从请求中获取用户信息并将其传递到模型中。这通常是如何发生的? Controller 是否应该创建一个用户对象,然后将其传递给模型?我确实不想只将一组值传递到模型中——我也不想将 15 个参数传递到创建用户的模型方法中。
  3. 为了让这个模式真正起作用,在我看来我需要一个域对象,它只是一个没有行为的简单数据结构,然后如果我使用 ORM,我将有一个 ORM对象,它将描述对象是如何被持久化的。最初我拒绝这样做,因为它感觉像是重复的代码,但如果我真的将持久性与业务逻辑分开,那么这将是必需的,对吗?例如,如果我使用内存存储怎么办?我将不再使用 ORM 对象。

我的想法是否正确?这是可以接受的吗。请帮我把脑海中的点连接起来。

最佳答案

1。这是存储库模式的正确实现吗?

我不确定您在哪里进行了这项研究,但您做错了。

  • Repositories至于分离 domain objects来自 data mappers .

  • 没有“模型”这样的东西。 MVC 设计模式中的模型是主要层之一:表示层模型层

  • 存储库模式与active record不兼容(反)模式,将域和存储逻辑结合在单个实例中,从而导致重大的SRP违规。

要使用真实世界的示例,何时以及如何使用存储库,这里是一个示例:

You are creating some document management tool, where said documents can come from several sources (for example: local SQL database, SOAP service and cache). In this situation you create a repository, which deals with the "routing" of storage. It is the part of application, that decides which data mapper to use for storing/retrieving each document.

存储库的目标是将域逻辑从与存储的交互中分离出来。对于上面描述的系统,存储库还可以添加新的数据源,而无需重写大量代码(如果有的话)。您可以为文档添加另一种类型的映射器。

2。 Controller 是否应该创建一个用户对象,然后将其传递给模型?

首先, Controller 本身不应该创建任何东西。相反,您的 Controller 应该使用工厂来获取您需要的对象的实例。这个工厂可以通过构造函数或其他一些方法提供给 Controller 。这称为:依赖注入(inject)(要了解更多信息,watch this lecture)。

此外,如上所述,模型是一个层,而不是任何特定的类或对象。 Controller 的职责是改变模型层的状态(通过向它传递数据)。您可以直接在 Controller 中与域对象和映射器(或存储库)交互,但这意味着会泄露 Controller 中的一些业务逻辑。建议改为使用 services ,然后操作所述域对象和存储相关结构。

至于 10+ 参数的问题,您需要创建新的用户帐户,我们假设您有以下足迹的操作:

public function postUser( Request $request )
{
    ....
}

如果使用特定的 Request 实例调用操作,您有两种选择来处理大量参数:

  1. 将实例包装在 decorator 中,这将让您调用一个方法来从特定数组中的请求中形成数据。然后将此数组传递给服务。

  2. 在 Controller 的操作中形成数组并传递给需要数据的地方。

前一种解决方案更适合大型应用程序,在这种应用程序中,需要通过代码重复形成这种数据。但在中小型项目中,第二种选择是常识性方法。

事实上, Controller 的工作是获取用户的输入,并将其分发到模型层和当前 View 。这种阵列的形成正好符合这一要求。

3。 (..) 主要对象,它只是一个没有行为的简单数据结构,然后 (..)

没有。域对象不是“简单数据”。它是大多数域业务逻辑驻留在应用程序中的地方。

忘掉神奇的 ORM。实现存储库的第一步是分离域和存储逻辑。域对象处理验证和业务规则,映射器处理持久性和数据完整性(小示例 here)。

您必须意识到的另一件事是,Web 应用程序的存储库并不真正与内存中的持久性(缓存除外)交互。相反,您的存储库将处理不同数据源的映射器。

关于php - MVC 和存储库模式 : Roles of Controllers, 模型和存储库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12343969/

相关文章:

php - 将 php 变量显示到 JavaScript 弹出框中

php - php中的比较运算符重载

java - 将事件监听器放在不同的类中会更好吗?

design-patterns - ViewModel 是否适合 Model View Presenter 模式?

php - 页面动画 - 滚动文本

javascript - 如何使用 function() 将一个 div 移动到另一个 div 中

c# - 如何编写转换器类?如何高效编写映射规则?

amazon-web-services - 批量工作负载与微服务调用

java spring boot HTTP POST 请求不起作用

html - 用户登录和注销时使用 2 个 CSS 文件设置的 Rails 应用程序 root_path (Rails)