# 依賴注入
* * * * *
依賴注入其實本質上是指對類的依賴通過構造器完成自動注入。
說白了就是自動注入對象,數組,其他值 等。
說到依賴注入就不得不提到容器,現在主流開發框架都有容器的概念,一個杯子可以理解為一個容器,一個水桶也可以理解為容器,咱們不管容器的載體是誰,只需要知道在咱們代碼中容器就是裝數據滴。
依賴注入一般是提前通過文件定義,然后解析文件找到對應的類實例化對象給予到容器中。
還可以在生命周期過程中將對象或其他數據先放入容器中,在后續環節進行使用。
總之玩法五花八門,為了解決的問題就是咱們用對象不用new了,咱們用數據不用重新寫邏輯了 等。
下面看看OneBase的依賴注入如何以TP5為容器。
~~~
/**
* 控制器層引用業務邏輯層
* 執行查詢文章列表邏輯
* 前綴 logic
*/
$this->logicArticle->getArticleList();
/**
* 業務邏輯層引用模型層
* 執行模型查詢文章列表
* 前綴 model
*/
$this->modelArticle->getList();
/**
* 業務邏輯層引用驗證層
* 執行文章分類數據編輯場景驗證
* 前綴 validate
*/
$this->validateArticleCategory->scene('edit')->check([]);
/**
* 業務邏輯層引用服務層
* 執行存儲服務下的七牛驅動進行文件上傳
* 前綴 service | driver
*/
$this->serviceStorage->driverQiniu->uploadFile(130);
~~~
看過OneBase源碼應該可以發現,咱們并沒有看到對象 new 的過程,也沒有看到引入相關文件,為什么就能執行進去呢?更神奇的是還能自動分辨代碼是在admin模塊還是common模塊。。。
下面來講解下實現原理
從系統架構中可以看出來,OneBase的控制器根源在于公共控制器ControllerBase,打開后找到__get這個方法,此處簡單的介紹下這個方法就是當你獲取對象屬性值時沒找到的時候就會執行這個方法。
代碼如下
~~~
/**
* 獲取邏輯層實例
*/
public function __get($name)
{
!str_prefix($name, LAYER_LOGIC_NAME) && exception('邏輯層引用需前綴:' . LAYER_LOGIC_NAME);
return model(sr($name, LAYER_LOGIC_NAME), LAYER_LOGIC_NAME);
}
~~~
既然在公共控制器而其他控制器都繼承了公共控制器,那么就說明在其他控制器中調用屬性找不到就會執行到這里來咯。
$this->logicArticle->getArticleList();
this 當然就是當前控制器對象啦,logicArticle 如果自己之前沒有在控制器中定義那肯定是找不到咯,所以就執行過來了。
get 方法中進行了前綴的檢測,如果不是 logic 開頭則拋出異常提示,若前綴沒問題則調用TP的model函數找到邏輯層下的邏輯對象返回。
打開model函數一路追蹤下去會發現根源實際上在Loader類中,而此類中的對象是做了單例模式,意味著在一次生命周期中多次調用實際上是沒有new新對象的。
現在就可以理解了為什么OneBase可以直接$this->logicArticle就執行進了業務邏輯層,是因為this對象中找不到,就進了get方法,然后通過TP加載的對象,這就是設計上的一個小技巧,以后用OneBase開發項目中直接$this->前綴+類名 就可以直接當做對象使用。
業務邏輯層也是類似的實現原理,只不過多了驗證器等層的識別。
作者建議前綴與目錄名稱保持一致,比如 $this->logicArticle->getArticleList(); 咱們通過這句代碼一看就知道了 是業務邏輯層目錄 logic 下的 Article 類。
是不是有點意思喲,這樣寫代碼的過程中就不需要管對象咯,需要的時候就來咯,而且來滴還是非常快。^_^
- 序言
- 基礎
- 安裝環境
- 安裝演示
- 規范
- 目錄
- 介紹
- 后臺介紹
- 后臺首頁
- 會員管理
- 系統管理
- 系統設置與配置管理
- 菜單管理
- 系統回收站
- 服務管理
- 插件管理
- 文章管理
- 接口管理
- 優化維護
- SEO管理
- 數據庫
- 文件清理
- 行為日志
- 執行記錄
- 統計分析
- 接口介紹
- 接口文檔
- 錯誤碼設計
- Token介紹
- 前臺介紹
- 架構
- 架構總覽
- 生命周期
- 入口文件
- 模塊設計
- 依賴注入
- 控制器架構
- 邏輯架構
- 驗證架構
- 服務架構
- 模型架構
- 行為架構
- 插件架構
- 配置
- 配置介紹
- 配置加載
- 配置擴展
- 請求
- 請求信息
- 日志
- 后臺行為日志
- 系統執行日志
- 框架日志
- 數據
- 數據庫設計
- 數據字典
- 數據庫操作
- 事務控制
- 混合操作
- 實戰
- 控制器
- 邏輯與驗證
- 視圖與模型
- 插件研發
- 服務研發
- 接口研發
- 雜項
- 數據導入導出
- 二維碼條形碼
- 郵件發送
- 云存儲服務
- 支付服務
- 短信服務
- 微信分享
- 生成海報
- 聊天室
- PJAX
- Demo
- Widget
- 附錄
- 常量參考
- 配置參考
- 函數參考
- 進階
- Redis
- 自動緩存
- 全自動緩存
- 索引
- 數據簽名
- 全自動事務
- 隊列