了解痘痘

2022-08-30 23:26:48

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

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

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

从我所读到的内容来看,Pimple正是做这种事情的,但是我该如何使用它呢?:s


答案 1

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是接口的一部分,它允许您像数组一样访问对象,因此当您执行Pimple时,它将检查它是否具有为foo定义的闭包,它是否只是一些参数并相应地组装服务。ArrayAccess$container['foo']

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


答案 2

我不知道Pimple,但我所知道的DI引擎会从你的手中夺走实例化。您的对象不会创建其依赖项的实例。相反,DI 引擎会创建它们,并根据请求将它们分发出去。

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


推荐