8

我无法弄清楚如何从自定义类中获取 ServiceManager 实例。

在控制器内部很容易:

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

现在,我创建了一些独立的类,我需要Zend\Log在该类中检索实例。在 zend 框架 v.1 中,我通过静态调用完成了它:

Zend_Registry::get('myCustomLogger');

如何检索My\CustomLoggerZF2 中的内容?

4

1 回答 1

12

让您的自定义类实现ServiceLocatorAwareInterface.

当您使用 ServiceManager 实例化它时,它会看到正在实现的接口并将自己注入到类中。

您的班级现在将在其操作期间与服务经理一起工作。

<?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 的上下文中有效,我假设您正在使用它,因为您提到了一个控制器。

它之所以有效,是因为它Zend\Mvc\Service\ServiceManagerConfig向 ServiceManager 添加了一个初始化程序。

$serviceManager->addInitializer(function ($instance) use ($serviceManager) {
    if ($instance instanceof ServiceLocatorAwareInterface) {
        $instance->setServiceLocator($serviceManager);
    }
});

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

于 2013-07-26T19:07:55.157 回答