Rendi la tua classe personalizzata implementare il ServiceLocatorAwareInterface
.
Quando si crea un'istanza con ServiceManager, vedrà l'interfaccia che viene implementata e si inietta nella classe.
Ora la classe avrà il gestore dei servizi con cui lavorare durante le sue operazioni.
<?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.
Perché questo dovrebbe funzionare?
Questo funziona solo nel contesto di Zend \ Mvc, che presumo tu stia utilizzando perché hai menzionato un controller.
Funziona perché il Zend\Mvc\Service\ServiceManagerConfig
aggiunge un inizializzatore al ServiceManager.
$serviceManager->addInitializer(function ($instance) use ($serviceManager) {
if ($instance instanceof ServiceLocatorAwareInterface) {
$instance->setServiceLocator($serviceManager);
}
});
fare un tentativo e fatemi sapere cosa succede.
fonte
2013-07-26 19:07:55
Oltre alla risposta di Jerry, consiglierei di inserire solo la dipendenza necessaria nella classe personalizzata. Quindi, se hai solo bisogno dell'oggetto logger nella tua classe personalizzata, allora fai in modo che la fabbrica della tua classe personalizzata inietti l'istanza del logger quando crei una nuova istanza della tua classe personalizzata. – Ruben
Come sottolineato da Sam e Ruben, sarebbe meglio NON far dipendere la classe dal ServiceManager. Invece, sarebbe meglio iniettare direttamente il logger nella classe. Puoi farlo tramite un inizializzatore che cerca una LoggerAwareInterface "personalizzata" OPPURE crea una classe factory per la tua classe personalizzata. –