2016-03-30 226 views
0

我試圖整合到Xero的API - 我用下面的包裝:Laravel依賴注入/ IOC

https://github.com/drawmyattention/xerolaravel

我能夠用正面的方法,但我訪問API我真的很想解決這些依賴問題,並且一切正常,我仍然在學習這些東西。

我也跟着指示,補充說:

DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider::class 

要我app.php &我的控制器內,我試圖解決這個(我想?)

我開始通過執行以下操作:

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


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

即使是,產生錯誤:

BindingResolutionException in Container.php line 828: 
Unresolvable dependency resolving [Parameter #0 [ <required> $app ]] 
in class Illuminate\Support\ServiceProvider 

如果這是一個愚蠢的問題,我真的很抱歉 - 我還沒有涉足拉拉維爾這邊。

+0

刪除'as Xero'或將您的構造函數更改爲'Xero $ xero'。 – jardis

回答

1

服務提供商僅用於設置所有的綁定和一切國際奧委會。正如您所提到的那樣,您將其添加到您的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']; 
}); 

你需要做同樣的事情爲PublicApplicationPartnerApplication

$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\PublicApplicationXeroPHP\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上行一新實例並注入。它對上面顯示的其他類也會這樣做。

+1

令人印象深刻的答案。你真的幫我弄清楚瞭解發生了什麼事。感謝您所做的努力! – ExohJosh

0

使用您指定別名:

use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero; 

class Foo { 

    private $xero; 

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

}