2

我已经构建了一个内部 MVC PHP 框架,现在我正在努力实现 DI 容器。我采用 Pimple 作为 DiC,我读过 Chris Hartjes 的书The Grumpy Programmer's Guide To Building Testable PHP Applications(我觉得这是一本非常好的和鼓舞人心的读物,强烈推荐它!),谈话轻松了我了解更多关于 TDD 的信息。无论如何,如果我在框架的核心中获得了一个 DI,我应该如何填充定义以及我应该传递它。

  1. 注入容器(注入应用程序对象一直到用户创建的控制器)。-错误
  2. 强制开发用户在引导程序中“填充”它 -错误
  3. 单例 -非常错误
  4. 观察者模式(DiC 附加到观察者。观察者作为 DiC 的前端)- ?(可能是最糟糕的想法:D)

然后如何使核心 DiC 在整个框架中可用(例如,注入配置对象),而不创建任何依赖项,不必要地强迫用户对其进行编码或增加创建 XML/JSON 或任何其他的开销。

PS:**我相信我会看到很多关于控制反转(IoC)和服务定位器的答案。我似乎无法确切了解如何实现它们。请参考我的简单/基本指南。

4

1 回答 1

2

(免责声明,我是PHP-DI的开发者)

我不太明白你的问题,在我看来,如果你完全控制了 MVC 框架,那么使用 DI 和 DIC 应该很容易。这是PHP-DI主页上DI介绍的副本:

  • 应用程序需要 FooController 所以:
  • 应用程序从容器中获取 FooController,所以:
    • 容器创建 SomeRepository
    • Container 创建 BarService 并为其提供 SomeRepository
    • Container 创建 FooController 并为其提供 BarService
  • 应用程序调用 FooController
    • FooController 调用 BarService
      • BarService 调用 SomeDependency
        • SomeRepository 做了一些事情

Container 负责创建所有对象(对象图),然后非框架代码(控制器、服务……)无需调用Container 即可工作。

那么如何让核心DiC在整个框架中可用呢?

不要让它在整个框架中可用。

每个组件(对象)都应该注入其依赖项(例如在构造函数中)。容器将注入它们(因为容器会创建所有对象),并且应该在应用程序的根目录(前端控制器)调用容器。


示例:您想在控制器中注入配置对象:

class MyController {
    private $configuration;

    public function __construct(Configuration $configuration) {
        $this->configuration = $configuration;
    }
}

既然那个DIC的作用就是创建那个控制器,它就会注入配置对象。

另外,我认为您不应该注入整个配置对象,而应该只注入您感兴趣的值(但这是另一个争论)。

此外,如果您对如何编写控制器有疑问,也许您应该阅读以下内容:控制器即服务?.

于 2013-10-19T21:12:49.107 回答