您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“l(fā)aravel中的make方法有什么作用”,內(nèi)容詳細,步驟清晰,細節(jié)處理妥當,希望這篇“l(fā)aravel中的make方法有什么作用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在laravel中,make方法用于從容器當中解析一個type,該type是源碼當中定義的,解析后返回的結(jié)果就是type的一個實例,容器類調(diào)用make方法時,若沒有已注冊的key,會自動通過反射類實例化具體類。
本文操作環(huán)境:Windows10系統(tǒng)、Laravel6版、Dell G3電腦。
Laravel中的make方法是用來從容器當中解析一個type,這個type是源碼當中定義的,不是很好翻譯成中文。解析后返回的結(jié)果就是type的一個實例。
看過源碼的同學應(yīng)該知道在Illuminate\Foundation\Application這個類和它的父類Illuminate\Container\Container類中都有make方法,那么當執(zhí)行如index.php中的這行代碼,
1 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);
的時候,就會首先去執(zhí)行Illuminate\Foundation\Application中的make方法,那么我們就先看看它。(這篇文章就以make這個Kernel類為例)
/** * Resolve the given type from the container. 從容器當中解析給定的type * * (Overriding Container::make) 覆蓋了父類中的make方法 * * @param string $abstract 給定的type * @param array $parameters 指定一些參數(shù) 可選項 * @return mixed */ public function make($abstract, array $parameters = []) { $abstract = $this->getAlias($abstract);//調(diào)用父類中的getAlias方法 //如果在deferredServices這個數(shù)組設(shè)置了這個type并且在instances數(shù)組中沒有設(shè)置這個type if (isset($this->deferredServices[$abstract]) && ! isset($this->instances[$abstract])) { $this->loadDeferredProvider($abstract);//那么就執(zhí)行這個方法:加載被定義為延遲的服務(wù)提供者 } return parent::make($abstract, $parameters);//調(diào)用父類的make方法 }
好,我們一步一步的來,先看看這個getAlias方法,這個方法的作用就是返回這個類的別名,如果給出的是一個完整的類名且在aliases中已經(jīng)設(shè)置了那么就返回這個類名的別名,如果沒有設(shè)置過就返回這個類名本身,大家在看這個方法的時候可以先var_dump一下$app,對照著看里面的aliases數(shù)組,框架作者寫這個方法真的很巧妙,至少這種遞歸方式在我實際開發(fā)當中很少用到。
/** * 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這個兩個數(shù)組進行判斷,在本例 $kernel = $app->make(Illuminate\Contracts\Http\Kernel::class); 當中,判斷的結(jié)果為false,因此不執(zhí)行l(wèi)oadDeferredProvider方法。
再接下來就是調(diào)用父類Illuminate\Container\Container中的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);//直接調(diào)用resolve方法 }
讀到這里,這篇“l(fā)aravel中的make方法有什么作用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領(lǐng)會,如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。