2013-07-26 13 views
7

Non riesco a capire come ottenere l'istanza di ServiceManager dall'interno della classe personalizzata.ZF2: come ottengo l'istanza di ServiceManager dall'interno della classe personalizzata

All'interno del controller è facile:

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

Ora, ho creato alcune classi indipendenti e ho bisogno di recuperare Zend\Log esempio all'interno quella classe. In v.1 Zend Framework ho fatto attraverso il call statica:

Zend_Registry::get('myCustomLogger'); 

Come posso recuperare il My\CustomLogger in ZF2?

+4

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

+0

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. –

risposta

11

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.

+7

L'approccio generale è corretto, tuttavia desidero suggerire che non dovresti avere ServiceLocator come dipendenza, ma solo le cose di cui hai bisogno DAL serviceManager (ad esempio la classe di registrazione o l'adattatore db o whatnot) – Sam

+0

Grazie Jerry. Ha funzionato. – user2033934

Problemi correlati