2013-07-26 18 views
7

ServiceManager örneğinin özel sınıfın içinden nasıl alınacağını bulmakta sorun yaşıyorum. denetleyici İçindeZF2: ServiceManager örneğini özel sınıfın içinden nasıl alabilirim?

çok kolay: Artık

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

, birkaç bağımsız sınıfları oluşturulmuş ve bu sınıfın içine Zend\Log örneğini almak gerekir.

Zend_Registry::get('myCustomLogger'); 

nasıl ZF2 içinde My\CustomLogger alabilirsiniz: zend framework v.1 olarak ben statik çağrı yoluyla yaptı?

+4

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

+0

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

cevap

11

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

+7

Genel yaklaşım doğrudur, ancak ideal olarak ServiceLocator'u bağımlılık olarak değil, yalnızca ServiceManager'dan (yani, logging sınıfı veya db bağdaştırıcısı veya whatnot) – Sam

+0

Teşekkürler Jerry'ye ihtiyacınız olan şeyleri belirtmeniz gerektiğini ima etmek istiyorum. İşe yaradı. – user2033934

İlgili konular