2013-07-26 8 views
7

Ich habe Probleme herauszufinden, wie ServiceManager-Instanz aus der benutzerdefinierten Klasse zu erhalten.ZF2: Wie bekomme ich ServiceManager-Instanz aus der benutzerdefinierten Klasse

in der Steuerung ist es einfach:

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

Nun habe ich ein paar unabhängige Klassen und ich brauche Zend\Log Instanz innerhalb dieser Klasse abzurufen. im Zend Framework v.1 habe ich es durch statischen Aufruf:

Zend_Registry::get('myCustomLogger'); 

Wie kann ich die My\CustomLogger in ZF2 abrufen?

+4

Zusätzlich zu Jerrys Antwort würde ich Ihnen empfehlen, nur die Abhängigkeit in die benutzerdefinierte Klasse zu injizieren. Wenn Sie also nur das Loggerobjekt in Ihrer benutzerdefinierten Klasse benötigen, müssen Sie die Factory Ihrer benutzerdefinierten Klasse in die Loggerinstanz einfügen, wenn Sie eine neue Instanz Ihrer benutzerdefinierten Klasse erstellen. – Ruben

+0

Wie Sam und Ruben darauf hingewiesen haben, wäre es besser, wenn Ihre Klasse NICHT vom ServiceManager abhängig wäre. Stattdessen wäre es besser, den Logger direkt in die Klasse zu injizieren. Sie können dies entweder über einen Initialisierer tun, der nach einem "benutzerdefinierten" LoggerAwareInterface sucht ODER eine Factory-Klasse für Ihre benutzerdefinierte Klasse erstellen. –

Antwort

11

Lassen Sie Ihre benutzerdefinierte Klasse das ServiceLocatorAwareInterface implementieren.

Wenn Sie es mit dem ServiceManager instanziieren, sieht es die implementierte Schnittstelle und injiziert sich selbst in die Klasse.

Ihre Klasse verfügt jetzt über den Service-Manager, mit dem während des Betriebs gearbeitet werden kann.

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

Warum sollte das funktionieren?

Dies funktioniert nur im Zusammenhang mit dem Zend \ Mvc, von dem ich annehme, dass Sie verwenden, weil Sie einen Controller erwähnten.

Es funktioniert, weil Zend\Mvc\Service\ServiceManagerConfig dem ServiceManager einen Initialisierer hinzufügt.

$serviceManager->addInitializer(function ($instance) use ($serviceManager) { 
    if ($instance instanceof ServiceLocatorAwareInterface) { 
     $instance->setServiceLocator($serviceManager); 
    } 
}); 

Probieren Sie es aus und lassen Sie mich wissen, was passiert.

+7

Der allgemeine Ansatz ist richtig, aber ich möchte darauf hinweisen, dass Sie idealerweise nicht den ServiceLocator als Abhängigkeit haben sollten, sondern nur die Sachen, die Sie brauchen, aus dem ServiceManager (d. H. Die Protokollierungsklasse oder den DB-Adapter oder whatnot) – Sam

+0

Danke Jerry. Es funktionierte. – user2033934

Verwandte Themen