2012-07-10 12 views
7

Şu anda bir hizmete ve tüm bağımlılıklarına hazır bir Symfony2 DI kapsayıcı örneğim var. Örneğin bir Car sınıfım var ve bağımlılıklar olarak Motor ve Işıklar var diyor.Temassız yükleme bağımlılıkları symfony ile DI

Şu anki kurulumda, Araç nesnesi oluşturulduğunda, bu bağımlılıklar otomatik olarak ayarlayıcı enjeksiyonu yoluyla otomatik olarak oluşturulur, ancak Araba nesnesinin bu kez ışığa ihtiyaç duymayacağı çok açık olabilir. Bu bağımlılığın bir örneğini oluşturmak için.

Symfony DI'de bunu başarmanın bir yolu var mı? Böylece sadece gerektiğinde Lights nesnesinin bir örneğini oluşturmak? Benim tahminim, Doctrine gibi bir çeşit Proxy uygulaması olacak ama gördüğüm kadarıyla Symfony DI'de bulunmuyor.

cevap

2

, otomatik olarak services.yml aracılığıyla Oluşturucu aracılığıyla zorunludur dedendencies enjekte edin.
İsteğe bağlı bağımlılıklarınız, gerektiğinde bunları Denetleyicinizdeki bir ayarlayıcıdan enjekte eder. gerekli whereever

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

Tabii Otomobil sınıfı kodu şöyle tasarlanmış ve controller içerisinde enjeksiyonları kendiniz yönlendirmek varsa, ya da olması gerekir.

1

Çok ilginç bir soru, ama Symfony2'nin Bağımlılık Enjeksiyon Kabı içinde mümkün olduğunu sanmıyorum. Kap sadece ne anlattığının farkındadır - bu durumda, belirli bir kullanım vakasına koşullu bir bağımlılığa sahip olursunuz. Ayrıca, hizmetlerin kaydının, uygulamanın hayatında erken gerçekleştiği için, bunu nasıl çalıştırabileceğinizi göremiyorum.

Belki de fabrika modelini kullanmalısınız. Bir hizmet olarak bir CarFactory kaydedin ve bir Car örneğini getirirken, bunun bir Light bağımlılık içermesi gerektiğini belirtebilirsiniz.

Bunu neden elde etmek istediğinizi sorabilir miyim? Daha basit bir çözüm olabilir.

+0

Durumumda DI bileşenini tek başına eski bir ZF projesine uygulıyorum. Hizmet sınıfının DBAL, ACL, vb. Gibi bağımlılıkları olan birkaç Service sınıfım var (AdminService, UserService, ...). Öte yandan, yalnızca bazı ServiceClass yöntemlerinde kullanılan bir Form ve bir Model gibi örnekler vardır. Bunlar "koşullu" bağımlılıklar. Symfony DI, varlıklar için doktrin kullanımı gibi bir proxy sistemine sahip olmadıkça, bunun da imkansız olduğunu düşünüyorum. – ChrisR

0

Oldukça geçici bir çözüm değil, ancak tüm DIC'yi enjekte etmeyi, sonra da gerektiğinde Işık ve Motor servislerini almayı deneyebilirsiniz.

ben Car sınıfında bu yöntemi gibi bir şey düşünüyordum:

protected function getLightService() 
{ 
    if (!$this->light) { //so we reuse the first instance 
     $this->light = $this->dic->get("car.light"); 
    } 

    return $this->light; 
} 
+0

Şu anda DI kapsayıcısı enjekte etmiyorum ama ZF FrontController'dan şu şekilde başvuruda bulunmuyorum: 'Zend_Controller_Front :: getInstance() -> getParam ('bootstrap') -> getDic()'. Bunu yapmamanın herhangi bir sebebi var mı? – ChrisR

+0

ZF ile deneyimim yok, bu yüzden buna cevap veremem. Eğer senin için iyi çalışıyorsa, sanırım sorun değil. – Maerlyn

2

Soru zaten yanıtlandı, ancak kimin bu işlevselliğe ihtiyacı olduğu için, Symfony 2.3'te tembel hizmetler uygulanır.

ProxyManager bridge ürününü kurmanız gerekir.

Resmi belgeleri here bulabilirsiniz.