2013-02-14 41 views
8

Hizmet yöneticimi varlık sınıfımda kullanmaya çalışıyorum ancak bunu yapmanın en iyi yolunu bilmiyorum.ServiceManager'ı Model Sınıfında kullanmanın en iyi yolu?

Bir denetleyici üzerinde kolay çünkü servis yöneticisini şu numaradan arayabiliriz: $ this-> getServiceLocator();

Yani en iyi yolu nedir: benim varlık sınıf hizmet yöneticisi ile demiyorlar çünkü

Ama benim varlık sınıfında, ben ServiceLocatorAwareInterface uygular bile ı ServiceManager retieve olabilir

1 - Benim varlık sınıfımdaki denetleyici 'dan ServiceManager'ı geçin 2 - Benim varlık sınıfım 3 - ...?

iyi sorunumu anlamak için, bu işe yaramazsa benim kod:

Benim varlık sınıfı:

class Demande extends ArraySerializable implements InputFilterAwareInterface { 
/../ 
    public function getUserTable() { 
    if (! $this->userTable) { 

     $sm = $this->getServiceLocator();//<== doesn't work ! 
     $this->userTable = $sm->get ('Application\Model\UserTable'); 
    } 
    return $this->userTable; 
} 

cevap

18

Ben senin modele ServiceManager enjekte olmaz (olabildiğince rağmen). Modelinizi sizin için oluşturmak için ServiceManager'ı almayı ve doğrudan modele ihtiyacınız olan her şeyi enjekte etmeyi tercih ederim.

Servis Yapılandırma:

'factories' => array(
    'SomethingHere' => function($sm) { 
     $model= new \My\Model\Something(); 

     return $model; 
    }, 
    '\My\Model\Demande' => function($sm) { 
     $model= new \My\Model\Demande(); 
     /** 
     * Here you use the SM to inject any dependencies you need 
     * into your model/service what ever.. 
     */ 
     $model->setSomething($sm->get('SomethingHere')); 

     return $model; 
    }, 
    /** 
    * Alternatively you can provide a class implementing 
    * Zend\ServiceManager\FactoryInterface 
    * which will provide an instance for you instad of using closures 
    */ 
    '\My\Model\DemandeDefault' => '\My\Model\DemandeFactory', 

Yeri Hizmetleri Müdürü Config'de içerdeki bağımlılıkları herhangi ve sonra sizin için modellere, hizmetler vb herhangi bağımlılıkları enjekte etmek olduğunu kullanın.

Eğer kapanışları yerine fabrika yöntemini kullanmak istiyorsanız bir örnek fabrika sınıfı:

DemandeFactory.php

use Zend\ServiceManager\FactoryInterface; 
use Zend\ServiceManager\ServiceLocatorInterface; 

class DemandeFactory implements FactoryInterface 
{ 
    /** 
    * Create a new Instance 
    * 
    * @param ServiceLocatorInterface $serviceLocator 
    * @return Demande 
    */ 
    public function createService(ServiceLocatorInterface $serviceLocator) 
    { 
     $config = $serviceLocator->get('Config'); // if you need the config.. 
     // inject dependencies via contrustor 
     $model = new \My\Model\Demande($serviceLocator->get('SomethingHere')); 
     // or using setter if you wish. 
     //$model->setSomething($serviceLocator->get('SomethingHere')); 

     return $model; 
    } 
} 

bir örnek Modeli Service Manager aracılığıyla örneğini çalışıyoruz.

Demande.php sizin Kontrolör olarak

class Demande 
{ 
    protected $_something; 

    /** 
    * You can optionally inject your dependancies via your constructor 
    */ 
    public function __construct($something) 
    { 
     $this->setSomething($something); 
    } 

    /** 
    * Inject your dependencies via Setters 
    */ 
    public function setSomething($something) 
    { 
     $this->_something = $something; 
    } 

    // Something will be injected for you by the Service Manager 
    // so there's no need to inject the SM itself. 
} 

:

public function getDemande() 
{ 
    if (! $this->_demande) { 
     $sm = $this->getServiceLocator(); 
     $this->_demande = $sm->get ('\My\Model\Demande'); 
    } 
    return $this->_demande; 
} 

Sen modellere SergiceManager/ServiceLocator enjekte edebilir ama sonra modeller ServiceLocator bağlı olacaktır.

+2

Çok faydalı cevap! ServiceManager'ı modele enjekte etmemek için başka bir neden de bu şekilde, bizim nesneyimizi serileştiremeyiz (ServiceManager üzerindeki kapaklar nedeniyle). Ve böylece modelleri oturumda kaydedemiyoruz. –

+1

Eklenmesi gereken tek şey, "Kapatma" çok fazla kullanmamanız gerektiğidir. Bunun yerine fabrika sınıflarını yaz. Bu, genel performansın artacağı gibi, sınıflar sadece talep üzerine oluşturulacaktır. Tüm Kapanışlar her bir istekte başlatılacaktır. – Sam

+1

Bir şey daha: Eğer bazı bağımlılıklar kesinlikle ** gerekli ise ** '__construct()' ya da Setter-Injection – Sam

İlgili konular