<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 依賴注入 * * * * * 依賴注入其實本質上是指對類的依賴通過構造器完成自動注入。 說白了就是自動注入對象,數組,其他值 等。 說到依賴注入就不得不提到容器,現在主流開發框架都有容器的概念,一個杯子可以理解為一個容器,一個水桶也可以理解為容器,咱們不管容器的載體是誰,只需要知道在咱們代碼中容器就是裝數據滴。 依賴注入一般是提前通過文件定義,然后解析文件找到對應的類實例化對象給予到容器中。 還可以在生命周期過程中將對象或其他數據先放入容器中,在后續環節進行使用。 總之玩法五花八門,為了解決的問題就是咱們用對象不用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 類。 是不是有點意思喲,這樣寫代碼的過程中就不需要管對象咯,需要的時候就來咯,而且來滴還是非常快。^_^
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看