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