SORU
25 Mayıs 2011, ÇARŞAMBA


Nasıl Symfony2 ile bir denetleyicisi dışındaki bir hizmet erişebilirim?

Ben bir inşaat alanı kullanır bu oldukça ağır bir üçüncü taraf API çok düşündüm gayet mantıklı için paket API sarıcı olarak hizmet, ancak ben başlıyorum bul örnekleri nerede olacağını yararlı gerekiyor erişmek için dışarıda bir Denetleyicisi gibi bir varlık depo. Bir denetleyici (varlık bir depo gibi yine) dışında config değerleri erişim elde edebilmek için yararlı olacağını da ilgilidir.

Eğer bu mümkün değilse söyle değilse orada bu tür bir şey yapmak için önerilen bir yaklaşım olabilir mi?

herhangi bir yardım için teşekkürler

CEVAP
25 Mayıs 2011, ÇARŞAMBA


Symfony dağılımı ağır bağımlılık enjeksiyon dayanır. Bu genellikle, bağımlılıkları doğrudan kurucu ile nesne, ayarlayıcıları veya diğer araçlar (özellikleri üzerinde yansıma gibi) enjekte anlamına gelir. API sarıcı servisi tarafından uygulamanın diğer nesneler için bir bağımlılık.

Bu söyleniyor, olabilir de oldukça zor enjekte bu hizmeti bir varlık depo yapıcı çünkü zaten gerektirir bazı diğer parametreleri ve bence bu olmaz Olası enjekte onlar yüzünden yolu istiyoruz depo için bir varlık.

Ne yapabileceğini varlık depodaki yapmak üzere olduğunuz işleri yapmaktan sorumlu olacak olan bir hizmet yaratmaktır. Bu şekilde, sen-ecek muktedir enjekte varlık yöneticisi, kullanılacak almak için varlık deposu, özel servis ve ayrıca başka bir hizmet holding yapılandırma değerleri (farklı yolları Var paylaşmak yapılandırma değerleri).

Kullanın benim durumumda, Facebook API çağrıları sarar Facebook Yardımcısı hizmeti kullanıyorum. Bu hizmet o zaman ben gereken yere enjekte edilir. Varlık benim depo ihtiyacı olan tek argüman ve bütün bağımlılık değil alabilmesi veritabanı aramaları yapmak için tek sorumludur. Böylece, yardımcı değil, sadece bağımsız bir istek yapmak için gerekli, örneğin, Facebook kullanıcı kimliği almazsınız. Benim görüşüme göre, bu varlık depo gibi yardımcı nesneleri üzerinde bağımlılıkları gerektiğini düşünüyorum çünkü yapmak için bir yoldur.

Burada küçük bir örnek yapılandırma olarak YAML kullanarak:

# app/config/config.yml
services:
  yourapp.configuration_container:
    class: Application/AcmeBundle/Common/ConfigurationContainer
    # You could inject configurations here      

  yourapp.api_wrapper:
    class: Application/AcmeBundle/Service/ApiWrapperService
    # Inject other arguments if needed and update constructor in consequence    

  yourapp.data_access:
    class: Application/AcmeBundle/Data/Access/DatabaseAccessService
    arguments: 
      entityManager: "@doctrine.orm.entity_manager"
      apiWrapperService: "@yourapp.api_wrapper"
      configuration: "@yourapp.configuration_container"

# Application/AcmeBundle/Common/ConfigurationContainer.php
public ConfigurationContainer
{
   public function __construct()
   {
       // Initialize your configuration values or inject them in the constructor
   }
}        

# Application/AcmeBundle/Service/ApiWrapperService.php
public ApiWrapperService
{
   public function __construct()
   {
       // Do some stuff
   }
}

# Application/AcmeBundle/Data/Access/DatabaseAccessService.php
public DatabaseAccessService
{
    public function __construct(EntityManager $entityManager, ApiWrapperService $apiWrapperService, ConfigurationContainer $configuration)
    {
        ...
    }
}

Config işareti ( @ ).yml dosya Symfony başka bir hizmet ,kimliği işareti ve basit bir dize sonra tanımladıktan sonra enjekte gerektiği anlamına gelir. Yapılandırma değerleri için daha önce de dediğim gibi, parametreleri kullanarak gibi aynı amaca ulaşmak için başka yollarla ya da paket bir uzantısı var. Bundle uzantılı, yapılandırma değerlerini doğrudan config içine tanımlayabilirsiniz.yml ve sizin onlardan bir demet okudular.

Sonuç olarak, bu hizmetleri enjekte ederek genel bir fikir verecektir. Belgeleri küçük bir listesi burada konu ile ilgili. Bağlantılar bir sürü YAML tanımını yerine XML hizmet tanımı kullanın ama oldukça kolay onları anlamak gerekir.

  1. Symfony Official DI
  2. Fabien Potencier's articles on DI
  3. Richard Miller's articles on DI (diğer Dİ makaleler için onun blog Kontrol edin)

Al veriyorum yapılandırma Symfony2 Beta1 için çalışıyor unutmayın. Bazı şeyler Beta 2 sürümünde olduğu gibi çalışmıyor olabilir bu yüzden henüz Beta 2 için güncelleme yapmadım.

Bu sorun için nihai bir çözüm tanımlamak yardımcı olacağını umuyoruz. Eğer bir açıklama veya başka bir şey istiyorsanız başka bir soru sormak için tereddüt etmeyin.

Saygılar, Matt

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Atlantic Records

    Atlantic Rec

    15 Aralık 2006
  • edwin maldonado

    edwin maldon

    28 Mart 2009
  • SRI International

    SRI Internat

    30 NİSAN 2008