Jur*_*nka 20 php model-view-controller dependency-injection instantiation
如何解决在PHP 中组成Controller类的问题,应该是:
向下看,使用依赖注入框架进行控制器实例化
问题是,派生的控制器可能使用程序员想要的任何资源(例如框架提供的).如何创建对共享资源(数据库,用户,存储,缓存,帮助程序),用户定义的类或其他库的统一访问?
我的问题有几种可能的解决方案,但两者看起来都不是优雅的
$controller->setApplication($app)User::getInstance()要么Database::getInstance()我明白,创建强耦合类是不鼓励和放逐:)但是我不知道这个范例如何适用于其他程序员(一个Controller类)的起点,他们应该能够访问所提供的共享资源到MVC架构.我相信,将控制器类分解成更小的类会以某种方式破坏MVC的实际意义.
DI Framework看起来是一个可行的选择.但问题仍然存在.类似Controller的类不在Application层中,而是在RequestHandler/Response层中.
该层应该如何实例化控制器?
您自己开发框架吗?如果没有,您的问题不适用,因为您必须从现有框架及其现有解决方案中进行选择。在这种情况下,您的问题必须重新表述,例如“我如何在框架 X 中进行单元测试/依赖项注入”。
如果您自己开发一个框架,您应该首先检查现有的框架如何解决这个问题。而且您还必须详细说明自己的要求,然后采用最简单的解决方案。如果没有要求,你的问题纯粹是审美和争论的。
以我的拙见,最简单的解决方案是拥有初始化为框架提供的默认值的公共属性,否则您可以在此处注入模拟。(这等于您的 getter/setter 解决方案,但没有提到的膨胀。您并不总是需要 getter 和 setter。)或者,如果您确实需要它,您可以提供一个构造函数来在一次调用中初始化它们(如您所建议的) 。
单例是一个优雅的解决方案,但同样,您必须问自己,它适用于您的情况吗?如果您的应用程序中必须有相同类型对象的不同实例,则不能使用它(例如,如果您希望仅在应用程序的一半中模拟类)。
当然,拥有所有的选择真是太棒了。您可以拥有 getter/setter、构造函数,并且当省略初始化时,默认值将从单例工厂获取。但是,在不需要的时候拥有太多选项并不好,反而会令人不安,因为程序员必须弄清楚要使用哪种约定、选项和模式。我绝对不想仅仅为了运行一个简单的 CRUD 而做出数十个设计决策。
如果您查看其他框架,您会发现没有灵丹妙药。通常,单个框架根据上下文使用不同的技术。在控制器中,DI 是一件非常简单的事情,看看 CakePHP 的 $helpers、$components 变量,它们指示将适当的变量注入到控制器类中。对于应用程序本身来说,单例仍然是一件好事,因为总是只有一个应用程序。不经常更改/模拟的属性是利用公共属性注入的。对于 MVC,子类化也是完全可行的选择:就像 CakePHP 中的 AppController、AppView、AppModel 一样。它们被插入到框架和所有特定控制器、视图和模型类之间的类层次结构中。这样,您就可以通过一个点来声明主要类类型的全局变量。
在 Java 中,由于动态类加载器和反射,您有更多的选项可供选择。但另一方面,您还必须支持更多要求:并行请求、工作线程之间的共享对象和状态、分布式应用程序服务器等。
只有当您首先知道自己需要什么时,您才能回答什么适合您的问题。但实际上,你为什么还要编写另一个新框架呢?
| 归档时间: |
|
| 查看次数: |
4653 次 |
| 最近记录: |