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.
'Xero'yu kaldır ya da kurucunuzu“ Xero $ xero ”olarak değiştirin. – jardis