我已经构建了一个内部MVC PHP框架,现在我正在努力实现DI Container。我已经采用了Pimple作为DiC,我已经读过Chris Hartjes的书“The Grumpy Programmer's Guide To Building Testable PHP Applications”(我发现这是一本非常好的和鼓舞人心的读物,会高度推荐它!),这次会谈使我更加了解TDD。无论如何,如果我在框架的核心中获得了DI,我应该如何填充定义,并且我应该将它传递给它。
然后如何在整个框架中使用核心DiC(例如,注入,配置对象),而不创建任何依赖关系,不必要强迫用户对其进行编码或增加创建XML / JSON或其他任何内容的开销其他
PS: **我相信我会看到很多关于控制反转(IoC)和服务定位器的答案。我似乎无法准确地实现它们。请参考我的简单/基本指南。
答案 0 :(得分:2)
(免责声明,我是PHP-DI的开发者)
我真的不明白你的问题,在我看来,如果你完全控制MVC框架,那么使用DI和DIC应该很容易。以下是PHP-DI主页上DI介绍的副本:
- 应用程序需要FooController所以:
- 应用程序从Container获取FooController,因此:
- Container创建SomeRepository
- Container创建BarService并为其提供SomeRepository
- Container创建FooController并为其提供BarService
- 应用程序调用FooController
- FooController调用BarService
- BarService调用SomeDependency
- SomeRepository做了一些事情
Container负责创建所有对象(对象图),然后非框架代码(控制器,服务......)在没有 EVER 调用Container的情况下工作。
那么如何在整个框架中提供核心DiC?
不要在整个框架中提供它。
每个组件(对象)都应该注入其依赖项(例如在构造函数中)。容器将注入它们(因为容器会创建所有对象),容器应该在应用程序的根目录中被称为(前端控制器)。
示例:您希望在控制器中注入Configuration对象:
class MyController {
private $configuration;
public function __construct(Configuration $configuration) {
$this->configuration = $configuration;
}
}
由于DIC的作用是创建该控制器,它将注入配置对象。
另外,我认为你不应该注入整个配置对象,而只是注入你感兴趣的值(但这是另一个争论)。
而且,如果您对如何编写控制器有疑问,也许您应该阅读:Controllers as services?。