php - DI容器和定制的MVC

标签 php model-view-controller dependency-injection inversion-of-control service-locator

我已经构建了一个内部 MVC PHP 框架,现在我正在努力实现 DI 容器。我已经采用 Pimple 作为 DiC,我读过 Chris Hartjes "The Grumpy Programmer's Guide To Building Testable PHP Applications " 的书(我发现这本书非常好且鼓舞人心,会强烈推荐它!),其中讲述了让我更了解 TDD。不管怎样,如果我在框架的核心得到一个 DI,我应该如何填充定义以及我应该如何传递它。

  1. 注入(inject)容器(将应用程序对象一直注入(inject)到用户创建的 Controller )。 - 错误
  2. 强制开发用户在 Bootstrap 中“填充”它 - 错误
  3. 单例 - 非常错误
  4. 观察者模式(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/

相关文章:

angular - 避免循环依赖注入(inject)

javascript - AngularJS的依赖注入(inject)中 ".config([...])"中的方括号是什么意思

php - Laravel 和批量分配保护

php - MVC - PHP session 验证

model-view-controller - 如何使用 MVC Razor View 将 HTML 内容绑定(bind)到 Iframe 中?

dependency-injection - 依赖注入(inject)最佳实践

javascript - wordpress pexeto 网格库自定义链接在单击时不会更改,在刷新时会更改

php - 检查给定区域/坐标内点的算法

javascript - 同时删除更多表并在使用 ajax.response 文本时出现错误

python - 如何使用模型/ View / Controller 方法制作 GUI?