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