九、依賴注入 - amattsuyolo/cham GitHub Wiki
參考文章:
- 書(依賴注入部分) :
- Laravel 5.7 實務專題範例教學:主流PHP開發框架入門
- 如何理解LARAVEL 的IOC容器:
- http://blog.twbryce.com/%E5%A6%82%E4%BD%95%E7%90%86%E8%A7%A3laravel-%E7%9A%84ioc-%E5%AE%B9%E5%99%A8/
依賴注入簡短介紹(Dependency Injection,DI)
目的:為達到控制反轉(Inversion of Control)
白話說明(去網咖):
- 我需要的'遊戲',不用自行'下載',而是'網咖提供'給我
- 我需要的'物件',不用自行'建立',而是'服務容器提供'給我
白話說明(去KTV):
- 我需要的'音樂',不用自行'下載',而是'KTV提供'給我
- 我需要的'物件',不用自行'建立',而是'服務容器提供'給我
php參考程式碼:
//低階模組
class LowLevelModule{
public function download(){
//下載 巫師三
echo "DONE";
}
}
//高階模組
class HighLevelModule{
private $lModule;
public funcrion __construct(){
$this->IModule= new LowLevelModule;
}
//載入遊戲
public function loadGame(){
$this->IModule->download();
}
}
`
//容器
$a=new HighLevelModule();
$a->loadGame();
上述程式碼 白話說: HighLevelModule 依賴於 LowLevelModule,在HighLevelModule的建構子 new 一個LowLevelModule。
那會造成什麼問題呢?
-
我們在Ioc容器中new了一個 HighLevelModule出來並呼叫其方法loadGame(),我們無法從單邊知道HighLevelModule()
依賴了或實做了什麼類別,程式變得不易閱讀。
-
如果要進行單元測試,測試失敗無法得知是哪一個方法出錯。
儘管上述問題,我們也不會將每個邏輯程式碼都寫在同一列別或方法,這樣會違反SOLID中的(Single Responsibility Principle)
開始使用依賴注入 主要分為:
-
方法注入
` public function signup(Request $request){` $name=$request->name; }
相信寫過laravel的人對其感到非常熟悉,通常用於依賴關係只想供某一類別中的特定方法使用時,可以選擇單獨注入之
- 建構子注入 //低階模組
class LowLevelModule{
public function download(){
//下載 巫師三
echo "DONE";
}
}
//高階模組
class HighLevelModule{
private $lModule;
public funcrion __construct(LowLevelModule $IModule){
$this->IModule= $IModule;
}
//載入遊戲
public function loadGame(){
$this->IModule->download();
}
}
` //容器
$a=new HighLevelModule(new LowLevelModule);
$a->loadGame();
關於laravel 以下截錄文件
There is no need to bind classes into the container if they do not depend on any interfaces. The container does not need to be instructed on how to build these objects, since it can automatically resolve these objects using reflection.
結論
文章中撰寫的注入,是手動注入
Laravel 框架實現則是自動注入
一般的類別是不需要綁定,它會利用reflection自動解析物件