2016-07-09 21 views
0

誰かが私を助けてくれますか?すべて正常に見えますが、依存性注入は私のクラスでは機能しません。このサービスプロバイダのレジスタにLaravel Dependancy Injection not working

enter image description here

、私はLaravelのブログを言っていることはシングルトンで、ドキュメントを読んでから、これは私がライン41

を行うときに、それが解決できるようにする必要があります。しかし、それ

Argument 1 passed to 
Aaranmcguire\Blog\Providers\AppServiceProvider::setSettings() must 
be an instance of Aaranmcguire\Blog\Blog, none given, called in 
.../aaranmcguire/Blog/src/Providers/AppServiceProvider.php 
on line 25 and defined 

私はライン41を削除した場合、私は正常に登録さを確認し、アプリの中からクラスをDDことができます。次のことを言って私にエラーを与えます。

私はこれで約1時間を費やしたことがありますか?

+0

この 'setSettings()'メソッドは何を呼びますか? – Hammerbot

+1

同じサービスプロバイダ内の@El_Matella 'Boot()' –

+0

@Aaran McGuireコードを画像http://meta.stackoverflow.com/a/285557/5510499として添付しないでください。 –

答えて

2

依存性注入は、IoC/Serviceコンテナを使用してクラスを解決したり、メソッドを呼び出すときにのみ発生します。自分でメソッドを呼び出すときに引数が必要な場合は、それらの引数を渡す必要があります。 LaravelはPHPの動作を変更しません。それらの特定のクラスが解決されているので、あなたは、コンストラクタの依存関係が注入されます理由がある

$this->anything(); // just a method call 
$something->anything(); // just another method call 

:彼らは直接法は、オブジェクト上で呼び出し、コンテナを使用していないです、これらの

どれもこれまでの依存性注入を伴わないだろうIoCコンテナを使用します。通常、フレームワークは直接コードではなく、そのようなコードを呼び出します。フレームワークがクラ​​スのメソッドを呼び出すとき、コンテナを使用してそのメソッドを呼び出すことができます。これはメソッド注入が行われる場所です。

コンテナはコメントとcall方法があります。

「を与えられた閉鎖/クラス@メソッドを呼び出し、その依存関係を注入します。」

サービスプロバイダのbootメソッドは、IoCコンテナを介して呼び出され、そのメソッドには、サービスプロバイダのLaravelドキュメントに従って依存関係が挿入されます。

"サービスプロバイダのブート方法の依存関係をタイプヒントできます。サービスコンテナは必要な依存関係を自動的に注入します...「 Laravel 5.2 Docs - Service Providers - The Boot method

Illuminate\Foundation\[email protected]から:

protected function bootProvider(ServiceProvider $provider) 
{ 
    if (method_exists($provider, 'boot')) { 
     return $this->call([$provider, 'boot']); 
    } 
} 

アプリケーションを使用すると、メソッドの型ヒントbootメソッドのパラメータと得ることができる理由である、プロバイダにbootメソッドを呼び出すためにcallメソッドを使用しています注入:プロバイダオブジェクト上で直接bootを呼び出すのではなく、コンテナを使用して呼び出します。

contaiの機能を使用するには容器を使用しなければならない。

- これはLaravel 5.2を参照していますが、IoCはバージョン間で非常に同じです。

2

結合とメソッド注入を混合しています。

結合(シングルトン):

public function register() { 
    $this->app->singleton('blog', function() { 
     return new \Blog(); 
    }); 
} 

public function setSettings() { 
    dd($this->app->blog); 
} 

方法注入:

public function setSettings(\Blog $blog) { 
    dd($blog); 
} 

編集:固定コード。

+0

さて、なぜメソッド注入がうまくいかないのでしょうか?私はそれを注入することを期待しているので、それは私が何も通っていないということです。 (サービスプロバイダ内で動作しない限り) –

+0

ドキュメントは、コントローラの機能としてメソッドインジェクションを記述します。だから私はそれがそこにしか利用できないと思う。バインドを使用して41行目を削除することができます。 – b263