17

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

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

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

从我读到的内容来看,Pimple 正是这样做的,但我该如何使用它呢?:秒

4

2 回答 2

19

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

另一种(但不一定推荐)方法是将容器注入到所有需要它的组件中(例如,您像 ServiceLocator 一样使用它),然后您只需按照文档中的说明从 Pimple 获取对象:

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

换句话说,您只需获取您需要的内容,Pimple 将处理该对象的生命周期,例如它是否需要被创建或被重用。OffsetGet 是ArrayAccess接口的一部分,它允许您访问像数组一样的对象,因此当您这样做时,$container['foo']Pimple 将检查它是否为 foo 定义了一个闭包,以确定它是否只是一些参数并相应地组装服务。

Pimple 是一篇关于 Lambdas 和 Closures 的博客文章的结果,您可能想阅读它以更好地了解它是如何工作的。

于 2012-05-21T12:38:50.490 回答
4

我不知道 Pimple,但我知道的 DI 引擎可以让你摆脱实例化。您的对象不会创建其依赖项的实例。相反,DI 引擎会根据要求创建它们并分发它们。

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

于 2012-05-21T12:35:33.720 回答