Dependency injection ServiceManager返回相同的实例,而shared=false
我为Dependency injection ServiceManager返回相同的实例,而shared=false,dependency-injection,zend-framework2,Dependency Injection,Zend Framework2,我为MyClass定义了一个别名,我希望可以通过ServiceManager检索该别名,请参见下面的module.config.php示例。当我通过$this->serviceLocator->get('MyClass')在控制器中检索MyClass的实例时,我第一次得到一个新实例,然后是同一个实例。我是否在配置中遗漏了一些东西,或者我应该提交一个bug module.config.php return array( 'di' => array( 'instance
MyClass
定义了一个别名,我希望可以通过ServiceManager检索该别名,请参见下面的module.config.php
示例。当我通过$this->serviceLocator->get('MyClass')
在控制器中检索MyClass
的实例时,我第一次得到一个新实例,然后是同一个实例。我是否在配置中遗漏了一些东西,或者我应该提交一个bug
module.config.php
return array(
'di' => array(
'instance' => array(
'alias' => array(
'MyClass' => 'Some\Namespace\MyClass',
),
'MyClass' => array(
'shared' => false,
),
),
),
);
我不知道
DI
,但是ServiceManager
希望您在管理器的配置数组的根中指定shared
(false)。大概是这样的:
'invokables' => array( // Note that you can use also 'factories', 'abstract_factories', etc.
'Some\Namespace\MyClass' => 'Some\Namespace\MyClass',
),
'alias' => array(
'MyClass' => 'Some\Namespace\MyClass',
),
'shared' => array(
'MyClass' => false,
),
请参阅手册上的ServiceManager
配置示例
希望这有帮助:)
斯托扬由于我的编辑未被接受,我将自己回答这个问题。最后,由于斯托扬·迪莫夫(Stoyan Dimov)将我推向了正确的方向,我转到了
ServiceManager
。不幸的是,他的回答不正确。我不得不使用invokables
而不是alias
。以下是正确的示例:
return array(
'invokables' => array(
'MyClass' => 'Some\Namespace\MyClass',
),
'shared' => array(
'MyClass' => false,
),
);
当我使用alias
而不是invokables
时,我得到了一个异常
,即不能使用具有该名称的服务,这意味着alias
不起作用,必须存在由invokables
,工厂
定义的现有服务,服务
或抽象工厂
按照前面的示例,我可以使用:
...
'alias' => array(
'SomethingDifferent' => 'MyClass',
),
...
<调用<代码> $$ -> Service EntoCalto>获取(“不同的”)< /C> >我将收到一个<代码>的实例\\ \NealStaby\MyCase./P>如果没有其他好的答案可用,我会考虑重构使用Service MeMaGeRi编辑的答案,因为它不起作用,如果通过,我将接受。您的编辑被拒绝,因为您不应该修改其他人答案中的代码,除非修复格式等。如您现在所做的那样发布新答案是您的最佳选择。