У меня возникли проблемы с выяснением того, как получить экземпляр 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); } });
Попробуйте и дайте мне знать, что произойдет.