当shared = false时,ServiceManager返回相同的实例

时间:2013-04-22 17:18:00

标签: dependency-injection zend-framework2

我为MyClass定义了一个我希望通过ServiceManager可以检索的别名,请参阅下面的module.config.php示例。当我通过MyClass在我的控制器中检索$this->serviceLocator->get('MyClass')的实例时,我第一次得到一个新的instane,然后是同一个实例。我是否会错过配置中的内容或者我应该提交错误?

module.config.php
return array(
    'di' => array(
        'instance' => array(
            'alias' => array(
                'MyClass' => 'Some\Namespace\MyClass',
            ),

            'MyClass' => array(
                'shared' => false,
             ),                 
         ),
    ),
);

2 个答案:

答案 0 :(得分:0)

我不知道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示例配置

希望这会有所帮助:)

斯托

答案 1 :(得分:0)

由于我的编辑未被接受,我将自己回答这个问题。最后,由于Stoyan Dimov将我推向正确的方向,我搬到了ServiceManager。不幸的是他的答案不正确。我必须使用invokables而不是alias。这是正确的例子:

return array(
    'invokables' => array(
        'MyClass' => 'Some\Namespace\MyClass',
    ),

    'shared' => array(
        'MyClass' => false,
    ),
);

当我使用alias代替invokables时,我得到了exception,没有可用的服务,这意味着alias不起作用,必须有invokablesfactoriesservicesabstract_factories定义的现有服务。

按照上一个例子,我可以使用:

...
'alias' => array(
    'SomethingDifferent' => 'MyClass',
),
...

致电$this->serviceLocator->get('SomethingDifferent')我会收到Some\Namespace\MyClass的实例。