我已经构建了一个内部 MVC PHP 框架,现在我正在努力实现 DI 容器。我已经采用 Pimple 作为 DiC,我读过 Chris Hartjes "The Grumpy Programmer's Guide To Building Testable PHP Applications " 的书(我发现这本书非常好且鼓舞人心,会强烈推荐它!),其中讲述了让我更了解 TDD。不管怎样,如果我在框架的核心得到一个 DI,我应该如何填充定义以及我应该如何传递它。
- 注入(inject)容器(将应用程序对象一直注入(inject)到用户创建的 Controller )。 - 错误
- 强制开发用户在 Bootstrap 中“填充”它 - 错误
- 单例 - 非常错误
- 观察者模式(DiC 附加到观察者。观察者作为 DiC 的前端)- ?(可能是最糟糕的想法:D)
然后如何使核心 DiC 在整个框架中可用(例如,注入(inject)配置对象),而不创建任何依赖项,不必要地强制用户对其进行编码或增加创建 XML/JSON 或任何内容的开销其他。
PS: ** 我确实相信我会看到很多有关控制反转 (IoC) 和服务定位器的答案。我似乎无法确切地了解如何实现它们。请引用一个简单/基本的指南。最佳答案
(免责声明,我是 PHP-DI 的开发者)
我不太明白你的问题,在我看来,如果你完全控制 MVC 框架,那么使用 DI 和 DIC 应该很容易。以下是 PHP-DI 主页上关于 DI 的介绍:
- Application needs FooController so:
- Application gets FooController from the Container, so:
- Container creates SomeRepository
- Container creates BarService and gives it SomeRepository
- Container creates FooController and gives it BarService
- Application calls FooController
- FooController calls BarService
- BarService calls SomeDependency
- SomeRepository does something
容器负责创建所有对象(对象图),然后非框架代码( Controller 、服务等)无需调用容器即可工作。
Then how to make the core DiC available in the whole framework?
不要使其在整个框架中可用。
每个组件(对象)都应该注入(inject)其依赖项(例如在构造函数中)。容器将注入(inject)它们(因为容器创建了所有对象),并且应该在应用程序的根(前端 Controller )调用容器。
示例:您想要在 Controller 中注入(inject)配置对象:
class MyController {
private $configuration;
public function __construct(Configuration $configuration) {
$this->configuration = $configuration;
}
}
由于 DIC 的作用是创建该 Controller ,因此它会注入(inject)配置对象。
另外,我认为您不应该注入(inject)整个配置对象,而应该注入(inject)您感兴趣的值(但这是另一个争论)。
此外,如果您对如何编写 Controller 有疑问,也许您应该阅读以下内容:Controllers as services? .
关于php - DI容器和定制的MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19459216/