2015-12-10 15 views
6

Başka bir yapılandırma hizmetinden bazı verileri getiren bir FooService var.Bir hizmetin başka bir hizmet için argüman olarak nasıl bir yöntem sonucu enjekte edilir?

Yapılandırma isteğine bağlı olarak yapılandırma farklı olduğundan bu yapılandırma hizmetim var. Yapılandırma hizmeti, RequestStack enjekte edilir ve ilgili yapılandırma dizisini oluşturur.

class Foo 
{ 
    private $config; 

    /** 
    * @param Config $config 
    */ 
    public function __construct(Config $config) { 
     $this->config = $config->getData(); 
    } 
} 

Oysa yerine hizmeti enjekte birim test için basit, ben, getData tek yöntemi çağrısı sonucu enjekte etmek tercih şu şekildedir:

Benim FooService görünüyor. Yapılandırmaya alay etmem gerekmeyecek, sadece bir dizi geçirebilirim.

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
    arguments: 
     - [@config, getData] 

Henüz bu çok bütün hizmet enjekte:

config: 
    ... 

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
    arguments: 
     - @config 

ben yoluyla fabrika yöntemleri için böyle benim foo tanımını değiştirmeyi denedim: Benim şimdiki service.yml

gibi bir tanım vardır.

Bir hizmetin başka bir hizmet için argüman olarak nasıl bir yöntem sonucu enjekte edilir?

cevap

8
Sen örnek olarak bir şeyler yapabiliriz doc here anlatıldığı gibi ifade dili ( New in Symfony 2.4)

ile bunu başarabilirsiniz

:

config: 
    ... 

foo: 
    class: Kopernikus\LeBundle\Service\Foo 
     arguments: ["@=service('config').getData()"] 

Umut bu yardım

+1

Köşeler burada bir dizi dizi enjekte ettiklerinden çok fazladır. Sadece '" @ = hizmet ('config'). GetData() "' yeterlidir. =) – k0pernikus

+0

[**] sürümünden beri burada (http://symfony.com/doc/3.3/service_container/expression_language.html) taşındı. ** 3 – Trix

0

Temelde bağımlılık enjeksiyon kabı istiyorsun. Foo'un yeni bir örneğini döndüren (örneğin) get() gibi basit bir işlevi olan kendi yapınızı oluşturabilirsiniz. Her bir nesne için get(), veya her zaman aynı nesneyi döndüren bir tekil (yeni bir statik değişkende saklayarak) yeni nesneler oluşturmak için tanımlayabilirsiniz. örneğin

,

<?php 
class FooContainer implements YourContainerInterface { 
    public static function get() { 
     // Config logic here 
     return new Foo($config); 
    } 
} 
+0

OP, resu nasıl enjekte edeceğini soruyor Bir yöntemin, hizmetin kendisi yerine bir servis çağırması - bunu neden yapmak istediklerini açık bir şekilde anlamadığım halde, problemi yanlış anlayabiliyorum. –

+0

@JeremyHarris Bu durumu neden kullanmak istediğim için kullanım durumunu güncelledim. – k0pernikus

+0

Bir işlevi bir şekilde iletmenin tek yolu, gerçekten herhangi bir tipte kontrol edemediğiniz için (ek mantık kullanmadan) ideal olan string ile gerçekleşir. PHP'de yapmanın uygun yolu konteyner nesnesidir. – Ian