服務提供商僅用於設置所有的綁定和一切國際奧委會。正如您所提到的那樣,您將其添加到您的config/app.php
中,然後您就不會再擔心它了。這不是你應該注射的課程。
不幸的是,從代碼的角度來看,這個包並沒有很好地爲依賴注入設置好自己。這是運營商內部的綁定的一個示例:
$this->app->bind('XeroPrivate', function() use ($config) {
return new \XeroPHP\Application\PrivateApplication($config);
});
了此綁定的,這意味着你可以通過調用$private = app('XeroPrivate');
解決新PrivateApplication
實例出國際奧委會。但是,因爲PrivateApplication
需要特殊構造(配置在構造函數中傳遞),所以此設置不會幫助您進行依賴注入。
綁定設置爲XeroPrivate
,但是,該類不存在,這意味着您不能鍵入提示它注入它。您可能在您的config/app.php
文件中添加了XeroPrivate
作爲別名,這將會繞過XeroPrivate
類不存在的問題,但這意味着將注入外觀類(這是別名指向的內容),而不是PrivateApplication
類。
爲了能夠正確地注入PrivateApplication
類,您需要設置自己的綁定。您可以創建一個新的服務提供商,或者只是添加到您的AppServiceProvider:
$this->app->bind('XeroPHP\Application\PrivateApplication', function ($app) {
return $app['XeroPrivate'];
});
你需要做同樣的事情爲PublicApplication
和PartnerApplication
:
$this->app->bind('XeroPHP\Application\PublicApplication', function ($app) {
return $app['XeroPublic'];
});
$this->app->bind('XeroPHP\Application\PartnerApplication', function ($app) {
return $app['XeroPartner'];
});
憑藉這些綁定,就可以安全注入任何類到你的構造函數中,並且它們將被正確地解決:
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;
}
當控制器被實例化時,它會看到它需要一個新的XeroPHP\Application\PrivateApplication
實例,並且它會使用我們上面創建的綁定(這又將XeroPublic
對象從IOC中解析出來)解析出IOC。它將爲XeroPHP\Application\PublicApplication
和XeroPHP\Application\PartnerApplication
執行相同操作。
其餘的類不需要任何特殊的構造,所以不需要爲它們創建自定義綁定。它們可以被注射的是:
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;
}
當控制器實例化時,會發現它需要一個新的XeroPHP\Models\Accounting\Invoice
實例,但在國際奧委會的這一類,因爲有沒有約束力,但它只是new
s上行一新實例並注入。它對上面顯示的其他類也會這樣做。
刪除'as Xero'或將您的構造函數更改爲'Xero $ xero'。 – jardis