laravel中make方法的作用是什么

laravel中,make方法用于從容器當中解析一個type,該type是源碼當中定義的,解析后返回的結果就是type的一個實例,容器類調用make方法時,若沒有已注冊的key,會自動通過反射類實例化具體類。

laravel中make方法的作用是什么

本文操作環境:Windows10系統、Laravel6版、Dell G3電腦。

laravel中make方法的作用是什么

Laravel中的make方法是用來從容器當中解析一個type,這個type是源碼當中定義的,不是很好翻譯成中文。解析后返回的結果就是type的一個實例。

看過源碼的同學應該知道在IlluminateFoundationApplication這個類和它的父類IlluminateContainerContainer類中都有make方法,那么當執行如index.php中的這行代碼,

1 $kernel = $app->make(IlluminateContractshttpKernel::class);

的時候,就會首先去執行IlluminateFoundationApplication中的make方法,那么我們就先看看它。(這篇文章就以make這個Kernel類為例)

?????/** ??????*?Resolve?the?given?type?from?the?container.?從容器當中解析給定的type ??????* ??????*?(Overriding?Container::make)?覆蓋了父類中的make方法 ??????* ??????*?@param??string??$abstract?給定的type ??????*?@param??array??$parameters?指定一些參數?可選項 ??????*?@return?mixed ??????*/ ?????public?function?make($abstract,?array?$parameters?=?[]) ?????{ ?????????$abstract?=?$this->getAlias($abstract);//調用父類中的getAlias方法 ?     //如果在deferredServices這個數組設置了這個type并且在instances數組中沒有設置這個type ?????????if?(isset($this->deferredServices[$abstract])?&&?!?isset($this->instances[$abstract]))?{ ?????????????$this->loadDeferredProvider($abstract);//那么就執行這個方法:加載被定義為延遲的服務提供者 ???????} ? ?????????return?parent::make($abstract,?$parameters);//調用父類的make方法 ?????}

好,我們一步一步的來,先看看這個getAlias方法,這個方法的作用就是返回這個類的別名,如果給出的是一個完整的類名且在aliases中已經設置了那么就返回這個類名的別名,如果沒有設置過就返回這個類名本身,大家在看這個方法的時候可以先var_dump一下$app,對照著看里面的aliases數組,框架作者寫這個方法真的很巧妙,至少這種遞歸方式在我實際開發當中很少用到。

????/** ??????*?Get?the?alias?for?an?abstract?if?available. ?????* ?????*?@param??string??$abstract ?????*?@return?string ????* ?????*?@throws?LogicException ?????*/ ????public?function?getAlias($abstract) ????{ ?????????if?(!?isset($this->aliases[$abstract]))?{ ????????????return?$abstract; ?????????} ? ????????if?($this->aliases[$abstract]?===?$abstract)?{ ????????????throw?new?LogicException("[{$abstract}]?is?aliased?to?itself."); ????????} ????????return?$this->getAlias($this->aliases[$abstract]); ?????}

?接下來就是對deferredServices和instances這個兩個數組進行判斷,在本例 $kernel = $app->make(IlluminateContractsHttpKernel::class); 當中,判斷的結果為false,因此不執行loadDeferredProvider方法。

再接下來就是調用父類IlluminateContainerContainer中的make方法了,

?????/** ??????*?Resolve?the?given?type?from?the?container. ??????* ??????*?@param??string??$abstract ??????*?@param??array??$parameters ??????*?@return?mixed ?????*/ ?????public?function?make($abstract,?array?$parameters?=?[]) ?????{ ??????return?$this->resolve($abstract,?$parameters);//直接調用resolve方法 ?}

【相關推薦:laravel視頻教程

以上就是

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享