了解疙瘩

时间:2012-05-21 12:30:22

标签: php dependency-injection

我不明白这个“DI容器”是如何使用的。官方网站上显示的示例告诉我什么:http://pimple.sensiolabs.org

基本上我有一个简单的站点,它由一组类组成:DB类,Cache类,User类以及一些处理内容类型的类。

所有这些类都像是在Pimple中提到的“服务”,每个服务都应该能够调用另一个服务。现在我正在实例化主类中的服务,我将它用作单例,以便在其他类之间共享服务。

从我读到的内容来看,Pimple确实做到了这一点,但我该如何使用呢? :■

2 个答案:

答案 0 :(得分:19)

http://phpmaster.com/dependency-injection-with-pimple/上有一个教程,解释如何将Pimple用作DIC。

另一种(但不一定是推荐的)方法是将容器注入到需要它的所有组件中(例如,你像ServiceLocator一样使用它)然后你只需要做文档说你应该做的事情来从疙瘩中获取一个对象:

class SomeClassThatNeedsSession
{
    private $session;
    public function __construct(Pimple $container) 
    {
        $this->session = $container['session'];
    }
}

换句话说,您只需获取所需内容Pimple will handle the lifetime of that object, e.g. whether it needs to be created or is reused即可。 OffsetGet是ArrayAccess接口的一部分,它允许你像一个数组一样访问一个Object,所以当你做$container['foo']时,Pimple将检查它是否有一个为foo定义的闭包,它是否只是一些参数和汇编相应的服务。

疙瘩是blog post about Lambdas and Closures的结果,您可能希望阅读以便更好地了解其工作原理。

答案 1 :(得分:4)

我不知道疙瘩,但我知道的DI引擎会让你的实例化。您的对象不会创建其依赖项的实例。相反,DI引擎创建它们并根据要求将它们分开。

因此,如果您的PHP代码正在创建新实例,我认为您应该更改它,以便您的代码获得DI引擎并询问它的依赖关系。