Özel sınıfınızın ServiceLocatorAwareInterface
uygulamasını gerçekleştirmesini sağlayın.
Bunu ServiceManager'la başlattığınızda, uygulanan arabirimi görecek ve kendini sınıfa enjekte edecektir.
Sınıfınız şimdi, işlemleri sırasında çalışmak üzere servis yöneticisine sahip olacak.
<?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.
Neden bu işe yarıyor?
Bu, yalnızca bir denetleyiciden bahsettiğiniz için kullandığınızı varsaydığım Zend \ Mvc bağlamında çalışır.
Zend\Mvc\Service\ServiceManagerConfig
ServiceManager'a bir başlatıcı eklediği için işe yarar.
$serviceManager->addInitializer(function ($instance) use ($serviceManager) {
if ($instance instanceof ServiceLocatorAwareInterface) {
$instance->setServiceLocator($serviceManager);
}
});
Bir deneyin ve me olur ne bildirin.
Jerry'nin cevabına ek olarak, yalnızca özel sınıfta ihtiyacınız olan bağımlılığı enjekte etmenizi tavsiye ederim. Dolayısıyla, özel sınıfınızda yalnızca logger nesnesine ihtiyacınız varsa, özel sınıfınızın fabrikasını, özel sınıfınızın yeni bir örneğini oluştururken logger örneğini enjekte edin. – Ruben
Sam ve Ruben'in belirttiği gibi, sınıfınızın ServiceManager'a güvenmemesi daha iyi olur. Bunun yerine, kaydediciyi doğrudan sınıfa enjekte etmek daha iyi olurdu. Bunu, "özel" bir LoggerAwareInterface için arayan VEYA özel sınıfınız için bir fabrika sınıfı oluşturan bir Initializer aracılığıyla yapabilirsiniz. –