【发布时间】:2011-01-13 17:58:48
【问题描述】:
如何解决PHP中组成Controller类的问题,应该是:
- 通过使用依赖注入轻松可测试,
- 为最终程序员提供共享对象
- 提供一种加载新用户库的方法
往下看,使用依赖注入框架进行控制器实例化
问题是,派生的控制器可以使用程序员想要的任何资源(例如框架提供)。如何创建对共享资源(数据库、用户、存储、缓存、助手)、用户定义的类或其他库的统一访问?
优雅的解决方案?
我的问题有几种可能的解决方案,但没有一个看起来很优雅
- 尝试通过构造函数传递所有共享对象? (即使有 10 个占位符也可以创建构造函数)
- 创建getter、settter? (臃肿的代码)
$controller->setApplication($app) - 在共享资源上应用单例?
User::getInstance()或Database::getInstance() - 使用依赖注入容器作为控制器内部对象共享的单例?
- 提供一个全局应用单例作为工厂? (这个在 php 框架中看起来很常用,但是它强烈违反了 DI 原则和 Demeter 定律)
我知道,不鼓励和禁止创建强耦合类:),但是我不知道这种范式如何应用于其他程序员(控制器类)的起点,他们应该能够访问提供给 MVC 架构的共享资源。我相信,将控制器类分解成更小的类会以某种方式破坏 MVC 的实际意义。
依赖注入框架
DI 框架看起来是一个可行的选择。然而问题仍然存在。像 Controller 这样的类并不位于 Application 层,而是位于 RequestHandler/Response 层。
这一层应该如何实例化控制器?
- 将 DI 注入器传递到该层?
- DI 框架作为单例?
- 仅为该层放置隔离的 DI 框架配置并创建单独的 DI 注入器实例?
【问题讨论】:
-
您在寻找特定于 PHP 的答案吗?
-
是的,我忘了说,语言是 PHP,但我认为解决方案应该与语言无关
-
我在询问之前已经阅读了它们。两者都建议使用依赖注入,但 DI 需要
parent来请求children,这是注入的。所谓的“父母”知道他要做什么,因此知道要问什么。我被困在控制器实现中。控制器应该是灵活的,所以最终程序员可以在应用程序逻辑中做他想做的一切。最好完全注入所有可能的对象吗?提供容器?但这会违反得墨忒耳定律…… -
也许你可以看看这个小的 DI 库。非常简单易用和可测试gabordemooij.com/harbour
标签: php model-view-controller dependency-injection instantiation