2016-07-09 160 views
0

有人可以幫助我,一切看起來很正常,但依賴注入不適合我的班。Laravel依賴注入不工作

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類從應用程序內,確認其註冊。

任何想法,因爲我在這花了近一個小時?

+0

什麼是調用這個'setSettings()'方法? – Hammerbot

+1

@El_Matella'Boot()'在同一個ServiceProvider內 –

+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']); 
    } 
} 

該應用程序使用call方法調用boot方法上的供應商,這就是爲什麼你可以類型提示的boot方法參數和GET方法注入它不直接調用提供者對象上的boot,它使用容器調用它

要使用容器的特徵必須使用容器。

- 這是引用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