让您的自定义类实现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);
}
});
试一试,让我知道会发生什么。