2016-03-30 33 views
0

Ben Xero API entegre çalışılıyor aşağıdaki sarmalayıcı kullanıyorum Bağımlılıkları çözmeyi gerçekten çok ister ve her şeyi doğru yapar, hala bu bitleri öğreniyorum.laravel bağımlılık enjeksiyon/IOC

Ben, talimatları takip ekledik:

DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider::class 

Ben (? Sanırım)

bu sorunu çözmek için çalışılıyor benim Kontrol Cihazının içinde benim app.php & için ben aşağıdakileri yaparak başlamak :

: bu bile
use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero; 
    private $xero; 


public function __construct(XeroServiceProvider $xero) 
{ 
    $this->xero = $xero; 
} 

Ve

, hata üretir

Eğer bu aptalca bir soru ise gerçekten çok üzgünüm - Laravel'in bu tarafına fazlaca girmedim.

+0

'Xero'yu kaldır ya da kurucunuzu“ Xero $ xero ”olarak değiştirin. – jardis

cevap

1

servis sağlayıcı sadece IOC için kurulum tüm bağlamaları ve her şeyi kullanılır. Bahsettiğiniz gibi, config/app.php'un içine eklersiniz, ve artık bunun için endişelenmeyeceksiniz. Bu, enjekte etmeniz gereken sınıf değil.

Maalesef, bu pakete bakarak, bağımlılık enjeksiyonu için kendini iyi ayarlamamıştır. Bu bağlanma ile

$this->app->bind('XeroPrivate', function() use ($config) { 
    return new \XeroPHP\Application\PrivateApplication($config); 
}); 

, sen $private = app('XeroPrivate'); arayarak IOC dışına yeni PrivateApplication örneğini çözmek anlamına gelir: Bu hizmet sağlayıcının içindeki bağları birinin bir örnektir. Ancak, PrivateApplication'un özel bir yapıya ihtiyaç duyması nedeniyle (yapılandırma yapılandırıcıda geçirilir), bu kurulum bağımlılık enjeksiyonunda size yardımcı olmaz.

Bağlama XeroPrivate için ayarlanmış, ancak bu sınıf mevcut değil, bu, enjekte edilmesini sağlamak için ipucu yazamazsınız anlamına gelir. XeroPrivate 'u config/app.php dosyanızda bir takma ad olarak eklemiş olabilirsiniz. Bu, XeroPrivate sınıfının bulunmadığı sorunu ortadan kaldıracaktır, ancak bu, cephe sınıfının PrivateApplication sınıfına değil, (bu, takma adın ne olduğu) enjekte edildiği anlamına gelir.

PrivateApplication sınıfını uygun şekilde enjekte edebilmek için kendi bağlamanızı ayarlamanız gerekir.Yeni bir servis sağlayıcı oluşturmak, ya da sadece AppServiceProvider bu ekleyebilirsiniz:

$this->app->bind('XeroPHP\Application\PrivateApplication', function ($app) { 
    return $app['XeroPrivate']; 
}); 

Sen PublicApplication ve PartnerApplication için aynı şeyi yapmak gerekir: güvenle yapabilirsiniz, bu bağlamaların ile

$this->app->bind('XeroPHP\Application\PublicApplication', function ($app) { 
    return $app['XeroPublic']; 
}); 

$this->app->bind('XeroPHP\Application\PartnerApplication', function ($app) { 
    return $app['XeroPartner']; 
}); 

Yapıcınızda içine sınıfların herhangi enjekte ve düzgün çözülecektir:

use XeroPHP\Application\PrivateApplication; 
use XeroPHP\Application\PublicApplication; 
use XeroPHP\Application\PartnerApplication; 

public function __construct(PrivateApplication $xeroPrivate, PublicApplication $xeroPublic, PartnerApplication $xeroPartner) 
{ 
    $this->xeroPrivate = $xeroPrivate; 
    $this->xeroPublic = $xeroPublic; 
    $this->xeroPartner = $xeroPartner; 
} 

kontrolör örneği oluşturulduğunda, o olacak Yeni bir XeroPHP\Application\PrivateApplication örneğine gereksinim duyduğunu ve bu örneği IOC'nin dışında oluşturduğumuz bağlamayı kullanarak (bu da XeroPublic nesnesini IOC'den çözer) çözecektir. XeroPHP\Application\PublicApplication ve XeroPHP\Application\PartnerApplication için aynısını yapacağız.

Sınıfların geri kalanı özel bir yapı gerektirmez, bu nedenle bunlar için özel bağlamalar oluşturmaya gerek yoktur. Onlar olduğu gibi enjekte edilebilir: kontrolör nesnelleştirildiğinde

use XeroPHP\Models\Accounting\Invoice; 
use XeroPHP\Models\Accounting\Invoice\LineItem; 
use XeroPHP\Models\Accounting\Contact; 
use XeroPHP\Models\Accounting\BrandingTheme; 
use XeroPHP\Models\Accounting\Attachment; 

public function __construct(Invoice $xeroInvoice, LineItem $xeroLineItem, Contact $xeroContact, BrandingTheme $xeroBrandingTheme, Attachment $xeroAttachment) 
{ 
    $this->xeroInvoice = $xeroInvoice; 
    $this->xeroLineItem = $xeroLineItem; 
    $this->xeroContact = $xeroContact; 
    $this->xeroBrandingTheme = $xeroBrandingTheme; 
    $this->xeroAttachment = $xeroAttachment; 
} 

, bunun yeni bir XeroPHP\Models\Accounting\Invoice örneğini ihtiyacı olduğunu göreceksiniz, ancak hiçbir bu sınıf için IOC içinde bağlayıcı orada olduğundan, sadece new kadar s bir yeni örnek ve bunu enjekte eder. Yukarıda gösterilen sınıfların geri kalanı için de aynısını yapacağız.

+1

Etkileyici bir cevap. Bana anlamaya ve neler olup bittiğini anlamaya gerçekten yardımcı oldunuz. Geçtiğiniz çaba için teşekkür ederiz! – ExohJosh

0

Belirlediğiniz diğer adı kullanın:

use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero; 

class Foo { 

    private $xero; 

    public function __construct(Xero $xero) 
    { 
     $this->xero = $xero; 
    } 

}