我不明白这个“DI容器”是如何使用的。官方网站上显示的示例告诉我什么:http://pimple.sensiolabs.org
基本上我有一个简单的站点,它由一组类组成:DB类,Cache类,User类以及一些处理内容类型的类。
所有这些类都像是在Pimple中提到的“服务”,每个服务都应该能够调用另一个服务。现在我正在实例化主类中的服务,我将它用作单例,以便在其他类之间共享服务。
从我读到的内容来看,Pimple确实做到了这一点,但我该如何使用呢? :■
答案 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引擎并询问它的依赖关系。