1. 这是否是 Repository 设计模式的正确实现?
我不确定你做了哪些研究,但是你搞错了。
为了提供一个真实的例子,说明什么时候以及如何使用 Repository,以下是一个示例:
您正在创建文档管理工具,其中所述文档可以来自多个来源(例如:本地 SQL 数据库、SOAP 服务和缓存)。在这种情况下,您可以创建一个 Repository,它处理“路由”存储。它是应用程序的一部分,负责决定存储/检索每个文档使用哪个数据映射器。
Repository 的目的是将领域逻辑与存储交互分离。对于上述系统,Repository 还将允许添加新的数据源,而无需重写大量代码(如果有的话)。您只需为文档添加另一种类型的映射器即可。
2. 控制器应该创建 User 对象并将其传递到模型中吗?
首先,控制器本身不应创建任何东西。相反,您的控制器应使用工厂获取需要的对象实例。可以通过构造函数或其他方法将此工厂提供给控制器。这称为:依赖注入(要了解更多信息,请观看此讲座)。
另外,如上所述,模型是一个层,而不是任何特定的类或对象。控制器的责任是改变模型层的状态(通过传递数据)。您可以直接在控制器中与领域对象和映射器(或 Repository)交互,但这将意味着在控制器中泄漏一些业务逻辑。建议使用服务,然后操作所述领域对象和存储相关结构。
至于创建新用户帐户时需要10个以上参数的问题,请假设您有一个具有以下特征的操作:
public function postUser( Request $request )
{
....
}
如果使用特定的Request
实例调用操作,您有两种处理大量参数的选项:
将实例包装在装饰器中,这样可以让您调用单个方法以形成特定数组中的请求数据。然后将此数组传递给服务。
在控制器的操作内部形成数组,并在需要数据的地方传递它。
前一种解决方案更适合大型应用程序,在其中需要反复进行此类数据形成。但是在小/中型项目中,第二个选项是常识性的方法。
问题在于,控制器的工作是接收用户的输入,并将其分发到模型层和当前视图。而这种数组的形成恰好符合这种要求。
3.(...)只是一个没有行为的简单数据结构,然后(...)
不是的。领域对象不是“简单数据”。它是应用程序中大多数领域业务逻辑所在的地方。
先忘记神奇的 ORM 吧。实现存储库的第一步是将领域逻辑与存储逻辑分开。领域对象处理验证和业务规则,映射器处理持久性和数据完整性(小例子在这里)。
还有一件事,您必须认识到的是,Web 应用程序的存储库实际上并不会与内存持久性(除了缓存之外)进行交互。相反,您的存储库将管理不同数据源的映射器。
User
对象。 - casablanca