2016-03-30 15 views
0

私はXeroなどのAPIに統合しようとしてる私は、次のラッパーを使用しています依存関係を解決してそれをすべて正しく行うことが本当に好きですが、私はまだこれらのビットを学んでいます。Laravelの依存性の注入/ IOC

私は、指示に従っ追加しました:

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 

これが愚かな質問であれば、本当に申し訳ありません。私はLaravelのこの側面に多くを取り入れていません。

use DrawMyAttention\XeroLaravel\Providers\XeroServiceProvider as Xero; 

class Foo { 

    private $xero; 

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

} 
+0

'as Xero'を削除するか、コンストラクタを' Xero $ xero'に変更してください。 – jardis

答えて

1

サービスプロバイダにのみセットアップにIOCのためのすべてのバインディング、すべてを使用している:

+1

印象的な答え。あなたは本当にそれを理解し、何が起こっていたのか理解するのを手伝ってくれました。あなたが行った努力をありがとう! – ExohJosh

0

は、あなたが割り当てたエイリアスを使用してください。あなたはあなたが言及したようにあなたのconfig/app.phpの中にそれを追加します、そして、あなたはもうそれについて心配しません。これはあなたが注入すべきクラスではありません。

残念ながら、コードを見ると、このパッケージは依存性注入のためにうまく機能しませんでした。この結合を

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

、あなたが$private = app('XeroPrivate');を呼び出すことにより、IOCのうち新しいPrivateApplicationインスタンスを解決できることを意味します。これは、サービスプロバイダの内部のバインディングの1の例です。しかし、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インスタンスが必要であることを確認し、上で作成したバインディングを使用してこのインスタンスをIOCから解決します(これにより、XeroPublicオブジェクトが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; 
} 

コントローラがインスタンス化されると、それは、このクラスのためにIOCに結合が存在しないので、それは新しいXeroPHP\Models\Accounting\Invoiceインスタンスが必要ですが、ことがわかります、それだけでnewのアップ新しいインスタンスとそれを注入する。上のクラスの残りのクラスでも同じことが行われます。