我在弄清楚如何从自定义类中获取ServiceManager实例时遇到了麻烦。

在 Controller 内部很容易:

$this->getServiceLocator()->get('My\CustomLogger')->log(5, 'my message');

现在,我创建了一些独立的类,并且需要在该类中检索Zend\Log实例。
在zend Framework v.1中,我通过静态调用做到了这一点:
Zend_Registry::get('myCustomLogger');

如何在ZF2中检索My\CustomLogger

最佳答案

使您的自定义类实现ServiceLocatorAwareInterface

当您使用ServiceManager实例化它时,它将看到正在实现的接口(interface)并将自身注入(inject)到类中。

现在,您的类(class)将有服务经理在其操作期间与之一起工作。

<?php
namespace My;

use Zend\ServiceManager\ServiceLocatorAwareInterface;
use Zend\ServiceManager\ServiceLocatorAwareTrait;

class MyClass implements ServiceLocatorAwareInterface{
    use ServiceLocatorAwareTrait;


    public function doSomething(){
        $sl = $this->getServiceLocator();
        $logger = $sl->get( 'My\CusomLogger')
    }
}

// later somewhere else
$mine = $serviceManager->get( 'My\MyClass' );

//$mine now has the serviceManager with in.

为什么要这样做?

这仅在Zend\Mvc的上下文中有效,因为您提到了 Controller ,所以我假设您正在使用Zend\Mvc。

之所以有效,是因为Zend\Mvc\Service\ServiceManagerConfig向ServiceManager添加了初始化程序。
$serviceManager->addInitializer(function ($instance) use ($serviceManager) {
    if ($instance instanceof ServiceLocatorAwareInterface) {
        $instance->setServiceLocator($serviceManager);
    }
});

试试看,让我知道会发生什么。

关于php - ZF2 : how do I get ServiceManager instance from inside the custom class,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17888728/

10-11 09:31