ZF2: как мне получить экземпляр ServiceManager из пользовательского класса

У меня возникли проблемы с выяснением того, как получить экземпляр ServiceManager из пользовательского класса.

Внутри контроллера это легко:

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

Теперь я создал несколько независимых классов, и мне нужно получить экземпляр Zend\Log внутри этого класса. В zend framework v.1 я сделал это через статический вызов:

 Zend_Registry::get('myCustomLogger'); 

Как я могу получить My\CustomLogger в ZF2?

Внесите свой собственный класс в 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); } }); 

Попробуйте и дайте мне знать, что произойдет.