【发布时间】:2017-01-20 00:27:51
【问题描述】:
我有一个以这种方式工作的简单 PHP MVC 框架:
StaticFramework (1)
|
V
DIC (2)
|
V
HTTPRequest
|
V
App <-> Router
|
V
Controller <-> Model
|
V
View
|
V
HTTPResponse
(1) StaticFramework 是一个静态的“前端控制器”,它通过 (2) DIC(依赖注入)为 App 提供默认依赖项Container),其工作方式类似于 Pimple。可以访问容器以更改这些默认依赖项。比如Router类被DIC注入到App中。
我这里有个问题,因为它是一个 MVC 应用程序,我有 3 个重要的层:
- 型号;
- 查看;
- 控制器。
注入View 很容易,因为它只是一个具有render 方法的类,用于呈现PHP 或HTML 文件,因此我只需在我的Controller 中注入View 的一个实例。
但是在Controller 中注入Model 似乎更难。每个Model 都是一个单独的类,所以我不能像为View 那样注入它。每个Model 可能还需要其他依赖项,例如Database 或XML 类。
此外,我无法预测 Controller 将需要哪些模型,因为它可能需要其中几个模型,例如,ArticleController 需要 ArticleModel 和 UsersModel。
我有几个解决方案:
- 在
Controller中注入ModelFactory类,这将为Controller实例化模型。但由于每个Model可能需要不同的依赖项,ModelFactory必须知道它需要哪一个,这对于类似于 Pimple 的DIC来说似乎是不可能的; - 不在
Controller中注入模型,并将它们中的每一个作为单独的类,这扩展了它们的需要。例如,如果需要 MySQL 连接,Model应该扩展Database。但这意味着模型紧密依赖于其父模型,这使得Model无法使用模拟类或拥有多个数据源,例如,如果Model需要Database和XML怎么办? ?
那么,就我的框架而言,在Controller 中注入模型的最佳方法是什么?
提前感谢您的回答。
【问题讨论】:
-
疙瘩不是 DIC 而是服务定位器
-
^ 这是一个美化的关联数组,用作服务定位器
-
@Linus 我知道其他一些 DIC 以不同的方式工作,例如通过反射预测依赖关系等,但是 Pimple 怎么不是 DIC?此外,我知道服务定位器是一种反模式,因为它在应用程序和服务定位器之间创建了紧密耦合。但是,例如,如果你在另一个对象中注入一个
Container(一个类似 Pimple 的对象),让它从上述Container中获取它的依赖关系,它是如何创建紧密耦合的,那么反模式又是如何产生的呢?顺便说一句,谢谢您的评论。 -
@TheKitsuneWithATie 看看这个stackoverflow.com/questions/16472924/…,如果注入到对象中,任何 DI 容器都是服务定位器
标签: php model-view-controller dependency-injection dependencies inversion-of-control