DI Container和量身定制的MVC

时间:2013-10-18 21:19:42

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

我已经构建了一个内部MVC PHP框架,现在我正在努力实现DI Container。我已经采用了Pimple作为DiC,我已经读过Chris Hartjes的书The Grumpy Programmer's Guide To Building Testable PHP Applications(我发现这是一本非常好的和鼓舞人心的读物,会高度推荐它!),这次会谈使我更加了解TDD。无论如何,如果我在框架的核心中获得了DI,我应该如何填充定义,并且我应该将它传递给它。

  1. 注入容器(在应用程序对象中一直注入用户创建的控制器)。 - 错误
  2. 强制开发用户在Bootstrap中“填充”它 - 错误
  3. Singleton - 非常错误
  4. 观察者模式(DiC附加到观察者。观察者作为DiC的前端) - ?(可能是最糟糕的想法:D)
  5. 然后如何在整个框架中使用核心DiC(例如,注入,配置对象),而不创建任何依赖关系,不必要强迫用户对其进行编码或增加创建XML / JSON或其他任何内容的开销其他

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

1 个答案:

答案 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?